【发布时间】: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.1 或HTTP/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