说我在浏览https://whateverxyz.com/index
主页的网站上。然后我要么
https://whateverxyz.com/app1.html
https://whateverxyz.com/app1.html
服务器可以区分请求是来自A
还是B
?运行在app1.html
上的客户端JavaScript可以说明区别吗?
来自您提问的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中编写一个侦听器,以检测此页面链接上的所有点击。在点击事件中,您可以在cookie
,IndexedDB
或localStorage
中编写链接URL和时间。然后在https://whateverxyz.com/app1.html
页面中你必须阅读这些信息。如果此信息未定义,则来自链接,在所有其他情况下,它来自书签(或者可能是在地址栏中提示,或者其他任何内容)。
查看相关问题:
我很害怕,你找不到!它只能在浏览器扩展中访问。
您可以在使用JavaScript加载页面后设置查询参数。 (使用history.pushState
所以它不重新加载)。喜欢:
history.pushState({}, "", "?bookmarked")
因此,当导航来自书签时,它使用?bookmarked
参数,当它是常规导航时,您将获得它而没有任何参数。
Working example,Code for example
编辑:正如评论中所指出的,这种方法存在两个问题。
?bookmarked
查询参数。?bookmarked
,即使它不是来自书签。 (可以像this question的答案中指出的那样解决)