Javascript `document.referrer` 在使用 HTTP->HTTPS Apache 重定向时消失
Javascript `document.referrer` vanishes when using a HTTP->HTTPS Apache redirection
我将我所有的网站从 HTTP 重定向到 HTTPS:
<VirtualHost *:80>
ServerName example.com
RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
DocumentRoot /www/example.com
SSLEngine on
...
</VirtualHost>
我注意到,从 anothersite.com
和
站点导航时
点击 link 到 https://example.com,Javascript 的 document.referrer
有效并给出 anothersite.com
点击一个link到http://example.com,Javascript的document.referrer
为空!
如何防止 document.referrer
在通过 Apache 使用 HTTP->HTTPS 重定向时消失?
或者我应该使用另一种方法进行自动 HTTP->HTTPS 重定向以保持 referrer
?
referrer header 是由浏览器发送的,显然一个新的请求没有携带前 2 个请求的 header。
由于是否发送 header 取决于浏览器,您只有有限的选择 - 我什至不能保证它会起作用:
通过添加
利用HSTS
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
(或类似的 - 选择您喜欢的值)到您的 https 虚拟主机。然后你仍然会错过第一个重定向的引荐来源网址,但一年内(63072000 秒)返回的任何人都会立即连接到 https。
注意:如果您(仅)在 http 上提供任何内容,任何曾见过(并尊重)HSTS 标志的浏览器都将无法使用它。
此外,还有很多情况(根据发现的漏洞,它们在历史上发生了变化),其中发送或不发送 header - numerous articles 对所有导致 header 出现或消失的条件。
检查,然后仔细检查,看看您是否属于可以忽略的类别之一。您不能假设 header 首先就在那里。
如 this answer 所述,由浏览器在重定向后发回引荐来源网址。显然,事实并非如此。
但是,您可以这样编写规则,如果 headers 中不存在,则从查询中读取引荐来源网址。
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}?referrer=%{HTTP_REFERER}
请注意,用户始终可以欺骗引荐来源网址。但是这种方法会让它更容易被欺骗。根据您的用例,此解决方案对您来说可能是一个安全问题。
更正
根据 this answer 当用户:
时,引荐来源网址将为空
switches from a https URL to a http URL.
HTTP specs 中的其他信息。
我将我所有的网站从 HTTP 重定向到 HTTPS:
<VirtualHost *:80>
ServerName example.com
RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
DocumentRoot /www/example.com
SSLEngine on
...
</VirtualHost>
我注意到,从 anothersite.com
和
点击 link 到 https://example.com,Javascript 的
document.referrer
有效并给出anothersite.com
点击一个link到http://example.com,Javascript的
document.referrer
为空!
如何防止 document.referrer
在通过 Apache 使用 HTTP->HTTPS 重定向时消失?
或者我应该使用另一种方法进行自动 HTTP->HTTPS 重定向以保持 referrer
?
referrer header 是由浏览器发送的,显然一个新的请求没有携带前 2 个请求的 header。
由于是否发送 header 取决于浏览器,您只有有限的选择 - 我什至不能保证它会起作用:
通过添加
利用HSTSHeader always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
(或类似的 - 选择您喜欢的值)到您的 https 虚拟主机。然后你仍然会错过第一个重定向的引荐来源网址,但一年内(63072000 秒)返回的任何人都会立即连接到 https。
注意:如果您(仅)在 http 上提供任何内容,任何曾见过(并尊重)HSTS 标志的浏览器都将无法使用它。
此外,还有很多情况(根据发现的漏洞,它们在历史上发生了变化),其中发送或不发送 header - numerous articles 对所有导致 header 出现或消失的条件。
检查,然后仔细检查,看看您是否属于可以忽略的类别之一。您不能假设 header 首先就在那里。
如 this answer 所述,由浏览器在重定向后发回引荐来源网址。显然,事实并非如此。
但是,您可以这样编写规则,如果 headers 中不存在,则从查询中读取引荐来源网址。
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}?referrer=%{HTTP_REFERER}
请注意,用户始终可以欺骗引荐来源网址。但是这种方法会让它更容易被欺骗。根据您的用例,此解决方案对您来说可能是一个安全问题。
更正
根据 this answer 当用户:
时,引荐来源网址将为空switches from a https URL to a http URL.
HTTP specs 中的其他信息。