确定请求是通过浏览器书签/收藏夹与链接?

问题描述 投票:5回答:3

说我在浏览https://whateverxyz.com/index主页的网站上。然后我要么

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

服务器可以区分请求是来自A还是B?运行在app1.html上的客户端JavaScript可以说明区别吗?

javascript http browser hyperlink bookmarks
3个回答
8
投票

来自您提问的Citate:

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

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

什么说我们的官方资源?

来自RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1)的Citate

如果目标URI是从没有自己的URI的源(例如,来自用户键盘的输入,或用户的书签/收藏夹中的条目)获得的,则用户代理必须排除Referer字段或者使用“约:空白”的价值。

Referer字段有可能揭示有关请求上下文或用户浏览历史的信息,如果引用资源的标识符显示个人信息(例如帐户名称)或应该保密的资源,则这是隐私问题(例如在防火墙后面或在安全服务内部)。当引用资源是本地“文件”或“数据”URI时,大多数通用用户代理不发送Referer头字段。如果使用安全协议接收引用页面,则用户代理不得在不安全的HTTP请求中发送Referer头字段。有关其他安全注意事项,请参阅Section 9.4

阅读更多相关信息:

替代方案

但是你可以在客户端做些什么。在页面https://whateverxyz.com/index中,您可以在JavaScript中编写一个侦听器,以检测此页面链接上的所有点击。在点击事件中,您可以在cookieIndexedDBlocalStorage中编写链接URL和时间。然后在https://whateverxyz.com/app1.html页面中你必须阅读这些信息。如果此信息未定义,则来自链接,在所有其他情况下,它来自书签(或者可能是在地址栏中提示,或者其他任何内容)。

查看相关问题:


2
投票

我很害怕,你找不到!它只能在浏览器扩展中访问。


0
投票

您可以在使用JavaScript加载页面后设置查询参数。 (使用history.pushState所以它不重新加载)。喜欢:

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

因此,当导航来自书签时,它使用?bookmarked参数,当它是常规导航时,您将获得它而没有任何参数。

Working exampleCode for example

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

  1. 浏览器中的URL栏将始终包含?bookmarked查询参数。
  2. 重新加载时,服务器将获得?bookmarked,即使它不是来自书签。 (可以像this question的答案中指出的那样解决)
© www.soinside.com 2019 - 2024. All rights reserved.