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

时间:2018-08-13 15:49:20

标签: javascript http browser hyperlink bookmarks

说我在一个浏览网站https://whateverxyz.com/index的网站上。那我要么

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

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

3 个答案:

答案 0 :(得分:8)

  

引用您的问题:

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

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

怎么说我们的官方资源?

  

引用来自 RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1)

     

如果目标URI是从没有自己的URI的来源获得的(例如,从用户键盘输入的或   用户的书签/收藏夹),则用户代理必须排除   引荐来源字段或将其发送为“ about:blank”。

     

“引荐来源网址”字段可能会泄露有关用户请求上下文或浏览历史的信息,这是一种隐私   关注参考资源的标识符是否显示个人   信息(例如帐户名)或应该使用的资源   保持机密(例如在防火墙后面或受保护的内部)   服务)。大多数通用用户代理不发送引荐来源   引用资源是本地“文件”或“数据”时的标头字段   URI。用户代理不得在以下位置发送引荐来源标头字段:   如果收到的引荐页带有一个   安全协议。有关其他安全注意事项,请参见Section 9.4

详细了解它:

替代解决方案

但是您可以在客户端执行某些操作。在页面https://whateverxyz.com/index中,您可以使用JavaScript编写一个侦听器,该侦听器可检测此页面链接上的所有点击。在点击事件中,您可以在cookieIndexedDBlocalStorage中编写链接URL 时间。然后,必须在页面https://whateverxyz.com/app1.html中阅读此信息。如果不是未定义此信息,则该信息来自链接,而在所有其他情况下,其信息来自书签(或者可能是在地址栏中输入的信息)。

查看相关问题:

答案 1 :(得分:2)

恐怕您找不到! 它只能在浏览器扩展中访问。

答案 2 :(得分:0)

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

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

因此,当导航来自书签时,它带有?bookmarked参数,当它是常规导航时,您将获得不带任何参数的导航。

Working exampleCode for example

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

  1. 浏览器中的URL栏将始终包含?bookmarked查询参数。
  2. 重新加载时,即使不是来自书签,服务器也会获得?bookmarked。 (可以按照this question的答案中指出的方法解决)