我的 httpd.conf 文件中有一个 Apache 301 重定向,它将所有流量重定向到单个域以实现规范化。我最近注意到此重定向不会在标头中保留引荐来源。 RFC2616似乎表明在重定向时保留引荐来源是可选的,并且实际上建议在 HTTP 和 HTTPS 之间交叉时不要这样做。
不过,我找到了其他问题其中一个简单的 Apache 301 重定向会保留引荐来源,这通常是默认情况。还有哪些其他因素可能会影响此行为,我可以尝试使用它们来保留引荐来源?这些因素是否仅基于 Apache 服务器版本和/或客户端的浏览器设置(即,超出我的控制范围)?
我的重定向:
ServerAlias www.example.com sub1.example.com
## Redirect all sub-domains to www
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com$1 [R=301,L]
关于上述重写规则,我正在访问http://sub1.example.com
。为了简单起见,我目前只使用 HTTP,直到我能弄清楚为止。
我确定引荐来源未被转移的方式是通过打开开发者工具的浏览器手动访问重定向站点。我还确定引荐来源未包含在$_SERVER
接收页面上的 PHP 全局变量中。我可以确认只发生了 1 次重定向。服务器端语言是 PHP。
以下是初始页面(sub1.example.com)的请求标头:
GET / HTTP/1.1
Host: sub1.example.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8
以下是初始页面(sub1.example.com)的响应标头:
HTTP/1.1 301 Moved Permanently
Date: Wed, 04 Oct 2017 18:14:34 GMT
Server: Apache
Upgrade-Insecure-Requests: 0
Location: http://www.example.com/
Cache-Control: max-age=1
Expires: Wed, 04 Oct 2017 18:14:35 GMT
Content-Length: 243
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
以下是接收页面(www.example.com)的请求标头:
GET / HTTP/1.1
Host: www.example.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8
Cookie: <redacted>
接收页面(www.example.com)的响应标头:
HTTP/1.1 200 OK
Date: Wed, 04 Oct 2017 18:14:34 GMT
Server: Apache
Upgrade-Insecure-Requests: 0
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
答案1
重定向(301 或其他)会向客户端(用户的浏览器)发送响应,该响应只是说“再次发送您的请求,但这次使用foo.com
”。如果客户端选择再次发送,那么它就会这样做,而它如何制定请求完全取决于客户端。由于服务器端没有任何操作,因此您无法影响 referer 的包含。