使用 HTTP->HTTPS Apache 重定向时,Javascript `document.referrer` 消失

问题描述

我将所有网站从 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

在通过 Apache 使用 HTTP->HTTPS 重定向时如何防止 document.referrer 消失?

或者我应该使用另一种方法进行自动 HTTP->HTTPS 重定向以保留 referrer

解决方法

referrer 标头由浏览器发送,显然新请求没有携带 2 个请求前的标头。

是否发送此标头取决于浏览器,因此您只有有限的选择 - 我什至不能保证它会起作用:

通过添加使用 HSTS

Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"

(或类似的 - 选择您喜欢的值)到您的 https 虚拟主机。然后你仍然会错过第一个重定向的引用,但任何在一年内(63072000 秒)回来的人都会立即连接到 https。

注意:如果您在 http(仅)上提供任何内容,任何曾经看到(并尊重)HSTS 标志的浏览器都将无法使用它。

此外,还有很多情况(根据发现的漏洞,它们在历史上发生了变化),其中是否发送标头 - numerous articles 可以说明所有情况导致标题出现或消失。

检查,然后仔细检查,如果您属于可以省略的类别之一。您不能假设标题首先就在那里。

,

this answer 中所述,在重定向后由浏览器返回 Referrer。显然,它没有。

但是,您可以像这样编写规则,如果标头中不存在引用,则可以从查询中读取引用。

  RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}?referrer=%{HTTP_REFERER}

请注意,用户始终可以欺骗推荐人。但是这种方法会更容易欺骗它。根据您的用例,此解决方案对您来说可能是一个安全问题。

更正

根据this answer,当用户:

从 https URL 切换到 http URL。

HTTP specs 中的其他信息。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...