【问题标题】:Recieving a 404 HTTPError on a working page in Ruby Script在 Ruby 脚本的工作页面上收到 404 HTTP 错误
【发布时间】:2025-12-01 23:00:01
【问题描述】:

这是我第一次提问,请温柔!

我有一个 Rails 应用程序可以处理一大堆域的内容(到目前为止超过 100 个)。每个域要么指向托管我的应用程序的位置(Heroku,如果您有兴趣),或者指向它托管的原始位置。每次域准备就绪时,它都需要指向 heroku 服务器,以便我的应用可以为其提供内容。

要检查域是否已成功从其原始位置转换到我的应用程序,我正在编写一个脚本来查找我包含在其中的特殊隐藏标签。如果它找到标签,则该域指向我的应用程序。如果没有,它没有改变,我记录下来。

问题是,到目前为止,至少对于一个域,我的脚本收到了 404 OpenURI::HTTPError 异常。这很奇怪,因为我可以很好地访问该站点,甚至可以通过 curl 获取它。有谁知道为什么工作网站会出现这样的错误?这是重要的sn-p:

require 'rubygems'
require 'open-uri'
require 'hpricot'
...
url = "http://www.#{domainname}.com"
doc = Hpricot(open(url)) #<---- Problem right here.
...

感谢您的所有帮助!

【问题讨论】:

  • 在询问或发布答案时,请确保将源 sn-ps 格式化为源代码。 (这次我已经为你做了。)
  • 谢谢。我以后会这样做的。

标签: ruby open-uri


【解决方案1】:

欢迎来到 SO!

这是我的调试方法:

  1. 看看您是否可以在 irb 中仅使用 open-uri 进行复制,而不使用 Hpricot:

$ irb -rubygems -ropen-uri

&gt;&gt; open('http://www.somedomain.com')

  1. 查看您的 Heroku 日志,看看它是否触及服务器。
  2. 查看原始服务器的日志是否相同。
  3. 打开 Wireshark 之类的文件以查看 HTTP 事务,并查看 404 是否确实返回。

从那开始,然后返回结果。

【讨论】:

  • 我用 irb 试过了;没有 Hpricot 也会做同样的事情。我要求的站点还没有指向 heroku 版本(这就是它进行良好测试的原因;应该记录它以进行修复),但它正在阻止我的脚本出现此错误。如果你很好奇,我想访问的网站是aquarium-equipment.com。我只需要红宝石来打开这该死的东西!
  • 好的,我已经取得了进展。我放弃了 open-uri 方法,而是决定使用 Net::HTTP。这产生了输出,而不是错误。但是,响应是 404 错误!该网站是完全可访问的,所以我不明白为什么。由于 curl 得到了正确的响应,我必须假设它与 ruby​​ 或 ruby​​ 与服务器交互的方式有关。
  • 您的服务器需要一个用户代理。默认情况下,OpenURI 不发送一个。这有效:open('http://www.aquarium-equipment.com', "User-Agent" =&gt; "Ruby/#{RUBY_VERSION}")
  • 哦,谢谢!我还在学习 Ruby,所以我非常感谢这样的帮助。谢谢!