通过 cURL 获取 RSS,在浏览器中正常但在终端中出现 404 错误

Posted

技术标签:

【中文标题】通过 cURL 获取 RSS,在浏览器中正常但在终端中出现 404 错误【英文标题】:Get RSS via cURL, fine in browser but 404 error in terminal 【发布时间】:2014-04-05 07:20:43 【问题描述】:

客户希望我们通过 RSS 提要提供内容,他们使用 cURL 来获取提要内容,但他们说他们收到了 404 错误。我在终端中尝试过这个命令:$ curl -g --compressed http://mediosymedia.com/wp-content/plugins/nextgen-gallery/xml/media-rss.php > temp.xml,正如客户所说,我得到的是 404 页面而不是提要。当我在浏览器中键入 URI 时,它会毫无问题地显示提要。

我无法更改客户端应用程序中的任何内容,那么,我如何确保他们获得提要而不是 404 错误?

谢谢!

【问题讨论】:

【参考方案1】:

确实,curl 返回一个 404 状态页面:

$ curl -g --compressed http://mediosymedia.com/wp-content/plugins/nextgen-gallery/xml/media-rss.php -s -o /dev/null -D-
HTTP/1.1 **404 Not Found**
Date: Tue, 04 Mar 2014 08:12:27 GMT
Server: Apache
X-Pingback: http://mediosymedia.com/xmlrpc.php
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8 

许多网络服务器会怀疑没有浏览器 User-Agent 的请求,因为他们希望 curl 用于抓取。这可能不是最聪明的技术,因为一个简单的 UserAgent 欺骗就能解决这个问题:

$ curl -g --compressed http://mediosymedia.com/wp-content/plugins/nextgen-gallery/xml/media-rss.php -s -o /dev/null -D- -H'User-Agent:  Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:27.0) Gecko/20100101 Firefox/27.0'
HTTP/1.1 **200 OK**
Date: Tue, 04 Mar 2014 08:13:46 GMT
Server: Apache
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: text/xml;charset=utf-8

因此,在实践中,请确保为您的不是 Curl 的请求设置用户代理。

【讨论】:

+1 - 这是正确的答案。我已经对其进行了测试并确认需要用户代理。 谢谢@JulienGenestoux,您的修复程序在终端中有效。但是,如何设置用户代理?正如我所说,我不能修改或要求修改客户端应用程序,所以我需要自己做。 我已经和我的托管公司谈过了,他们为那个提要添加了一个 mod_security 例外,所以它现在可以在没有用户代理的情况下工作。谢谢你们的时间【参考方案2】:

我最初认为这可能与 cookie 有关(请参阅this question),但这可能是本地化问题。这在我的机器上运行良好:

[root@devtest tmp]# curl -g --compressed http://mediosymedia.com/wp-content/plug
ins/nextgen-gallery/xml/media-rss.php > temp.xml
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 27926    0 27926    0     0  54564      0 --:--:-- --:--:-- --:--:-- 69815

更正:

感谢 Julien 指出下载文件的内容是自定义 404 页面内容。正如他所提到的,您需要在您的 curl 请求中添加一个用户代理标志 (-A):

# curl -A "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1
; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12"-g --compressed http://medio
symedia.com/wp-content/plugins/nextgen-gallery/xml/media-rss.php > temp.xml

我只想删除我的答案,但值得留下来作为对可能遇到此问题的其他人的警告 - 请确保您验证回复!

【讨论】:

我在检索它时也没有问题。 嗯,我得到了相同的输出,但这确实是 404! @JulienGenestoux - 好收获!我不知道为什么,但我期待返回的 404 标头会在响应中触发一些标志。我应该看看实际的返回值。

以上是关于通过 cURL 获取 RSS,在浏览器中正常但在终端中出现 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

GET 请求在浏览器中工作,但在 curl 中给出错误 SSL_ERROR_SYSCALL

Jenkins webbook 在 Bitbucket 中失败,但在 curl 中工作正常

使用 HttpClient POST 到 Form 但在浏览器中获取 SSLPeerUnverifiedException 工作正常

jQuery 响应在浏览器中为空,尽管 curl 有效

Php Curl 在本地机器上返回数据,但在服务器上返回 bool false

Spotify:发布到 api/token 给出了错误的请求,但在 curl 中工作