通过 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 工作正常