如何从HTTP头正确解析基准URL?Location头是否为基准URL?
首先先看你提供的这条301重定向响应头:
HTTP/1.1 301 Moved Permanently Date: Tue, 23 Jan 2018 14:12:27 GMT Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/5.4.16 X-Powered-By: PHP/5.4.16 Location: https://www.meetangee.com/ Content-Length: 0 Content-Type: text/html; charset=UTF-8
咱们逐个解答你的疑问:
1. 基准URL是否为Location头指定的URL?
答案是否定的。你提到的RFC2068确实提到基准URL可由HTTP头指定,但Location头的作用是指示客户端进行重定向跳转,它并不是用来定义基准URL的。
在HTTP规范中,基准URL的确定逻辑(按优先级)通常是:
- 首先看响应内容里的HTML
<base>标签(如果是HTML文档的话) - 其次是请求的原始目标URL(也就是你发起请求的那个地址)
- 特定场景下会用到
Content-Location头(比如返回的内容是原请求资源的替代版本时)
Location头完全是另一回事——它是告诉客户端“你要的资源已经永久搬到这个新地址了,去那请求吧”,和相对链接的基准URL没有关系。
2. 若要获取Location头的值,是否只需解析行内字符,或有更简便的方式?
如果你是自己手动解析HTTP响应,确实需要提取Location:后面的字符,但绝大多数HTTP客户端库都已经封装好了获取响应头字段的方法,完全不用手动解析。比如:
- Python的
requests库:response.headers['Location'] - JavaScript的
fetchAPI:response.headers.get('Location') - Java的
HttpURLConnection:connection.getHeaderField("Location")
这些方法会自动帮你处理头字段的大小写、空白字符等细节,比手动解析靠谱多了。
补充:关于“是否有HTTP头指定相对链接的基准URL”的规范冲突问题
你提到之前看到的回答和RFC2068相悖,那可能是因为RFC2068已经被后续的HTTP规范取代了。RFC2068是早期的HTTP/1.1规范,现在现行的HTTP/1.1规范是RFC7230、RFC7231等一系列文档,这些文档里并没有定义专门用于指定相对链接基准URL的HTTP头。
现行规范里,基准URL的确定逻辑我刚才已经提到了——主要依赖HTML的<base>标签或者请求的原始URL,Content-Location头只有在特定资源替换场景下才会参与基准URL的计算,但它并不是专门用来指定基准URL的头。所以如果之前的回答说“没有专门的HTTP头指定相对链接的基准URL”,这个说法是符合现行规范的。
如果你需要具体的规范来源,可以参考RFC7231的第7.1.2节(关于Content-Location)和RFC3986的第5节(关于基准URI的解析规则),里面明确了基准URI的确定方式,并没有提到专门的HTTP头来指定它。
内容的提问来源于stack exchange,提问作者Lukas Salich

