【问题标题】:XMLHTTP / HTTPRequest returning 404 response on custom error page requestsXMLHTTP / HTTPRequest 在自定义错误页面请求上返回 404 响应
【发布时间】:2013-12-06 01:28:36
【问题描述】:

我有一个程序使用 XMLHTTPRequest 从另一个网页收集内容。 问题是,该网页设置了隐藏自定义错误(即/thisurl 在其网络服务器上实际上并不作为文件存在,它是由自定义 404 错误文件生成的。),因此它不返回它在浏览器中显示的页面,而不是在我的 HTTPRequest 响应中显示来自该自定义错误页面的默认 404 错误响应。

通过使用这个网站http://web-sniffer.net/,我已经缩小了问题的范围,但我不知道如何解决它。

Web-sniffer 有 3 个不同的版本来提交请求:

    HTTP version: HTTP/1.1 
                  HTTP/1.0 (with Host header) 
                  HTTP/1.0 (without Host header)`

当我使用 HTTP/1.1 或 HTTP/1.0(带有 Host 标头)时,我会从页面获得正确的响应 (html)。但是当我使用HTTP/1.0 (without Host header) 时,它不会返回内容,而是返回 404 错误脚本(显示自定义错误页面)。

所以我得出结论,问题可能是由于请求中不存在Host 标头。

但我正在使用MSXML2.XMLHTTP.3.0,但无法使用HTTP/1.1HTTP/1.0 (with Host header) 读取页面。代码如下所示:

    Set objXML = Server.CreateObject("MSXML2.XMLHTTP.3.0")      
    objXML.Open "GET", URL, False
    objXML.setRequestHeader "Host", MyDomain '< Doesnt work with or w/out this line
    objXML.Send     

即使在请求中添加了 Host 标头后,我仍然会在响应中获得该自定义错误脚本返回的 404 错误模板,与该 web-sniffer 站点上的 HTTP/1.0 (without Host Header) 选项相同。这应该返回 200 OK,就像它在 web-sniffer 上的前两个选项中所做的那样,就像在 web 浏览器中一样。

所以我想我的问题是,那个网站 (web-sniffer.net) 能够通过他们的前两个 HTTP 版本选项获得正确的响应,所以我可以在我的应用程序中模拟它。我想得到正确的页面,但它只从他们的 404 错误模板返回 404 错误。


作为对一位回答者的回应,我提供了以下 2 个单独的 cUrl 请求的屏幕截图,每个请求来自我的每台服务器。

我执行了相同的 cURL 命令,相同的 url(指向主主机上的站点),即 cURL -v -I www.site.com/cloakedfile 。但看起来它不能在需要的主服务器上运行。这不可能是一个自存在的问题,因为从次要到次要它工作正常,这些都是相同的应用程序/站点,只是不同的 ip/主机名。这似乎是一个内部问题,可能与应用程序无关。

【问题讨论】:

  • 由于缓存和其他一些缺点,不建议在服务器应用程序中使用 XMLHTTP。在这种情况下,您可能会从缓存中获得响应。请阅读support.microsoft.com/kb/290761 的整篇文章,并使用 ServerXMLHTTP 进行相同的测试,以确定问题是否是 XMLHTTP。
  • 那你觉得应该用什么来做这个?

标签: vbscript asp-classic http-headers xmlhttprequest httprequest


【解决方案1】:

我对 MSXML2.XMLHTTP.3.0 没有任何想法。但从您的问题陈述中,我了解到问题肯定是由于您的请求中设置错误或遗漏了某些 HTTP 标头字段。

默认情况下,HTTP 1.1 客户端设置 Host 标头。例如,如果您连接到 google.com,则请求将如下所示

GET / HTTP/1.1
Host: google.com

“主机”标头应包含所请求资源所在服务器的域名。如果“主机:”标头不存在,则具有虚拟主机的服务器会感到困惑。如果您没有指定 Host 标头,groups.yahoo.com 会发生这种情况

$ nc groups.yahoo.com 80
GET / HTTP/1.1

HTTP/1.1 400 Host Header Required
Date: Fri, 06 Dec 2013 05:40:26 GMT
Connection: close
Via: http/1.1 r08.ycpi.inc.yahoo.net (ApacheTrafficServer/4.0.2 [c s f ])
Server: ATS/4.0.2
Cache-Control: no-store
Content-Type: text/html; charset=utf-8
Content-Language: en
Content-Length: 447

这应该与您面临的问题相同。并且还要确保您正在发送您尝试从中获取资源的服务器的域名。 Host 标头应该有一个冒号“:”来分隔值,如“Host: www.example.com”。

【讨论】:

  • 感谢您的回答。好吧,它在请求中发送 Host 标头,它与请求的 URL 中的主机/域相同。所以,不确定它还能是什么。奇怪的是,当我跨域执行它时(从我的登台服务器请求生产服务器)它实际上可以工作,但是当我在同一台服务器上执行它时(生产上的生产),它会给出 404 错误。奇怪。
  • 最好的调试方法是使用 curl 命令行实用程序。从登台服务器和 prod 对服务器进行 curl 调用,打开详细模式,以便它也会打印所有请求标头。这样您就可以确定导致此问题的原因。“curl -vL your.url”并发布结果会更有帮助。
  • 好的,我下载了 cURL 并截图了。请查看更新后的问题。
  • 你知道吗,我想通了。这是因为我的自定义错误被设置为为本地请求提供详细的错误,并且由于请求是自驻的,它是本地的,并且给出 404 错误而不是自定义错误。无论如何,使用 cURL 可以帮助我找出答案,谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-10-24
  • 2010-12-20
  • 2014-01-30
  • 2017-03-24
  • 2011-01-21
  • 2016-04-25
  • 2013-09-16
  • 2022-11-04
相关资源
最近更新 更多