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

站点导航时

如何防止 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 中的其他信息。