我有一个使用XMLHTTPRequest从另一个网页收集内容的程序。
问题是,该网页具有伪装自定义错误设置(即。/thisurl
不会在其Web服务器上作为文件存在,它是由自定义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(带有主机头)时,我从页面获得正确的响应(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错误的模板,与该网络嗅探器上的HTTP/1.0 (without Host Header)
选项相同现场。这应该像在web-sniffer上的前两个选项一样返回200 OK,就像在Web浏览器中一样。
所以我想我的问题是,那个网站(web-sniffer.net)能够通过他们的前两个HTTP版本选项获得正确的响应,所以我可以在我的应用程序中模拟这个。我想获得正确的页面,但它只返回404错误模板中的404错误。
作为对回答者的回应,我提供了以下2个单独的cUrl请求的屏幕截图,每个请求来自我的每个服务器。
我执行了相同的cURL命令,相同的url(指向主机上的站点),即cURL -v -I www.site.com/cloakedfile
。但看起来它不适用于主服务器,它需要在哪里。它不能是一个自存的问题,因为从二级到二级它工作正常,这些都是相同的应用程序/站点,只是不同的ip /主机名。这似乎是一个内部问题,可能不是关于事物的应用方面。
答案 0 :(得分:1)
我对MSXML2.XMLHTTP.3.0没有任何想法。但是从你的问题陈述我明白问题肯定是由于你的请求中错误地设置或错过了一些HTTP头字段。
默认情况下,HTTP 1.1客户端设置主机标头。例如,如果您要连接到google.com,则请求将如下所示
GET / HTTP/1.1
Host: google.com
“Host”标头应具有所请求资源所在的服务器的域名。如果“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
这应该是你面临的同一个问题。并确保您要发送您尝试获取资源的服务器的域名。主机头应该有一个冒号“:”来分隔值,如“主机:www.example.com ”。