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

如何解决使用 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 中的其他信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?