【问题标题】:Javascript `document.referrer` vanishes when using a HTTP->HTTPS Apache redirection使用 HTTP->HTTPS Apache 重定向时,Javascript `document.referrer` 消失
【发布时间】:2021-03-31 23:06:54
【问题描述】:

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

  • 单击指向https://example.com 的链接,Javascript 的document.referrer 工作并提供anothersite.com

  • 点击http://example.com的链接,Javascript的document.referrer是空的

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

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

【问题讨论】:

    标签: javascript apache mod-rewrite https referrer


    【解决方案1】:

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

    但是,您可以这样编写规则,如果标头中不存在引荐来源网址,则从查询中读取引荐来源网址。

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

    请注意,用户总是可以欺骗引荐来源网址。但是这种方法会更容易欺骗它。根据您的用例,此解决方案可能会给您带来安全问题。

    更正

    根据this answer,当用户时,referrer将为空:

    从 https URL 切换到 http URL。

    HTTP specs 中的其他信息。

    【讨论】:

    • 我编辑过,有一个类型:%{HTTP_REFERER} 而不是${HTTP_REFERER},你是这个意思吗?奇怪的是,它仍然不起作用:该字段对我来说总是一个空字符串。
    • @Basj 是的,这是一个错字。为了清楚起见,您需要从标头中读取referrer,如果标头中不存在,则回退到从查询字符串中读取它。
    • 是的,这部分很清楚,我将从(最后一个)HTTPS 请求中的查询字符串中读取它。但我不明白为什么 HTTP 请求会传递一个空的referrer=。可能是因为HTTP_REFERER 包含http://https:// 而Apache Rewriterule 不接受像https://example.com/?referrer=http://test.com 这样的重写URL?您是否对其进行了测试,它是否 100% 适合您?
    • 我们不应该encodeURIComponent HTTP_REFERER 作为查询字符串吗? Apache RewriteRule 允许这样做吗?
    • @Basj 我没试过,但是你可以在重写规则中传递查询参数。你的问题不一样。看到这个答案。 stackoverflow.com/a/6880668/2346893
    【解决方案2】:

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

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

    通过添加使用HSTS

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

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

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

    此外,在许多情况下(根据发现的漏洞,它们在历史上发生了变化),其中是否发送了标头 - numerous articles 揭示了导致标头的所有条件出现或消失。

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

    【讨论】:

    • 感谢您的回答。通常,这是有趣的网站上的第一次访问,它有助于了解流量来自哪里。这是否意味着第一次访问的推荐人丢失了? (“那么你仍然会错过第一个重定向的引用者”)难道没有 Apache 方法可以使用 RewriteRule 以外的其他方式进行重定向以避免丢失引用者吗?
    • 重定向启动一个新请求。您还可以尝试将引用标头标记到请求 URL 作为附加参数如果它首先在 http 请求中。或者,如果 http 日志记录了引荐来源标头,则将您的 http 日志与 https 日志相关联。
    • 查看我的附加编辑,其中包含更多首先出现(或不发送)标题的条件。
    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 2016-02-04
    • 2016-01-17
    • 2018-04-09
    • 2019-11-08
    • 2018-08-25
    • 2019-12-17
    • 2020-08-06
    相关资源
    最近更新 更多