代码之家  ›  专栏  ›  技术社区  ›  jwl

确定请求是通过浏览器书签/收藏夹还是链接发出的?

  •  5
  • jwl  · 技术社区  · 7 年前

    https://whateverxyz.com/index

    • (A) 单击页面HTML中的导航链接 https://whateverxyz.com/app1.html
    • (B) 点击浏览器书签

    服务器能否区分请求是否来自 A B ? 运行在上的客户端JavaScript app1.html

    3 回复  |  直到 7 年前
        1
  •  8
  •   Bharata colxi    7 年前

    引用你的问题:

    • 服务器能区分请求是来自A还是B吗?
    • 在app1.html上运行的客户端JavaScript能分辨出区别吗?

    在这两种情况下,都无法检测出差异。

    堡垒 RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1)

    如果目标URI是从没有自己URI的源获取的(例如,从用户键盘输入, 用户书签/收藏夹 ),用户代理必须排除

    Referer字段有可能显示有关用户的请求上下文或浏览历史的信息,这是一种隐私 关注引用资源的标识符是否显示 假定的信息(如帐户名)或资源 保密的(如在防火墙后面或在安全的 乌里。用户代理不能在 安全协议。见 Section 9.4 为了更多的安全考虑。

    替代解决方案

    但你可以在客户端做些什么。在页面中 https://whateverxyz.com/index 您可以用JavaScript编写一个侦听器来检测此页面链接上的所有单击。在单击事件时,您可以编写 链接URL 以及 cookie ,一个 IndexedDB localStorage . 然后在页面中 https://whateverxyz.com/app1.html 你必须阅读这些信息。在这种情况下,如果这个信息不是未定义的,它是从链接,在所有其他情况下,它是从书签(或可能是在地址栏倾斜,或其他)。

    参见相关问题:

        2
  •  1
  •   Iman Nia    7 年前

    恐怕你找不到!

        3
  •  0
  •   Mendy    7 年前

    使用JavaScript加载页面后,可以设置查询参数。(使用 history.pushState 所以它不会重新加载)。比如:

    history.pushState({}, "", "?bookmarked")

    ?bookmarked 参数,当它是一个常规导航时,您将得到它而不带任何参数。

    Working example Code for example

    编辑:正如评论中指出的,这种方法有两个问题。

    1. ?书签 查询参数。
    2. 重新加载时,服务器将获取 ?书签 this question )