为什么这个.vbs脚本会检索空值?
Option Explicit
On Error Resume Next
Dim h: Set h = CreateObject("MSXML2.XMLHTTP")
h.Open "HEAD", "http://google.com/", False
h.send
Dim GetLocation: Set GetLocation = h.getResponseHeader("Location")
MsgBox GetLocation
答案 0 :(得分:3)
默认情况下,几乎所有HTTP库都遵循重定向
因此,只要您遵循重定向,就无法获得Location
标题,因此您需要停止关注重定向。
我推荐两种不同的解决方案。
#1 实现最终网址是最简单的方法,而不是获得Location
标题。
Option Explicit
Dim GetLocation
Const SXH_OPTION_URL = -1
Dim h
Set h = CreateObject("MSXML2.ServerXMLHTTP")
h.Open "HEAD", "http://google.com/", False
h.send
GetLocation = h.getOption(SXH_OPTION_URL) 'final URL even if redirected
MsgBox GetLocation
#2 如果您想确保获得第一个 Location
标题(不是重定向链中的最后一个链接),您应该使用WinHttpRequest通过禁用重定向,因此您可以获得标头(如果可用)。
Option Explicit
Dim GetLocation
Const WHR_EnableRedirects = 6
Dim h
Set h = CreateObject("WinHttp.WinHttpRequest.5.1")
h.Option(WHR_EnableRedirects) = False 'disable redirects
h.Open "HEAD", "http://google.com/", False
h.Send
GetLocation = h.GetResponseHeader("Location") 'an error occurs if not exist
MsgBox GetLocation
答案 1 :(得分:1)
不确定为什么没有获得Location
HTTP标头,但您可以通过调整代码进行调试
Option Explicit
On Error Resume Next
Dim h: Set h = CreateObject("MSXML2.XMLHTTP")
h.Open "HEAD", "http://google.com/", False
h.send
Dim headers: headers = h.getAllResponseHeaders()
MsgBox headers
示例输出
Date: Fri, 18 Sep 2015 15:33:41 GMT Expires: -1 Cache-Control: private, max-age=0 Content-Type: text/html; charset=UTF-8 Server: gws X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN Alternate-Protocol: 443:quic,p=1 Alt-Svc: quic=":443"; p="1"; ma=604800 Transfer-Encoding: chunked
考虑到它不确定是否包含Location
,除非服务器从URL重定向。