WP笔记

Firefox自动预读功能导致WordPress hook运行两次

FirefoxFirefox浏览器具有自动预读的特性,当网页源代码中出现rel='next'或者rel='prefetch'的meta标签时,firefox会自动访问标签指向的链接,将其内容加载到缓存中,因为用户可能不久就要访问这个页面,可以提升访问速度。潜在的问题是,这种自动访问是在用户没有授权的情况下发生的。

 

Firefox Prefetching

Firefox自动预读(Forefox Prefetching)是如何工作的?

简单的说,当网页头部中出现如下meta标签时,firefox就自动自觉的去读取链接的内容

 <link rel="prefetch" href="http://www.domain.com">
 <link rel="next" href="http://www.domain.com/next-article/">

自动预读的好处:

通常,被标识为next或者prefetch的链接是用户接下来极有可能访问的地址,自动加载这个地址的内容到缓存,如果用户真的访问了,可以显著提升访问速度。

自动预读潜在的危险:

Firefox安装后,自动预读就是默认打开的,没有任何界面提示用户这个功能的存在,所以很多Firefox用户就在毫不知情的情况下允许Firefox去加载一些他们可能根本不会访问的网页。如果只是获取下一篇文章,没什么问题。如果网站中故意写上prefetch meta标签,并且指向一些病毒或者收集用户信息的网站,那就危险了。

自动预读给WordPress带来的问题

WordPress默认会输出

 <link rel="next" href="http://www.domain.com/next-article/">

一般情况下没问题,等于变相增加网站流量。特殊情况下,例如你想记录用户访问过哪些网页,精确记录,那Firefox预取功能就会自动获取用户尚未浏览且可能根本不会去看的下一页,或者说自动预取使访问一个页面时WordPress所有的钩子执行两遍,导致记录错误。

如果你遇到如下情况:

  • 本该记录一条meta信息,数据库中却出现两条,两条记录更新时间间隔几秒钟
  • 在当前页面输出了下一页的信息,例如输出了错误的meta description等等

这些都有可能是Firefox的自动预取功能导致的。

如何禁用自动预取功能

对WordPress网站,避免这个问题的方法是移除next标签,在主题的functions.php添加如下代码即可

remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');

对于普通用户,要关闭自动预取只能修改Firefox的配置文件:

  • 在Firefox地址栏输入about:config
  • 如果遇到警告提示,忽略警告,继续编辑
  • 在搜索栏查找network.prefetch-next,注意前后不要有空格
  • 找到后双击即可将default-true改为user set-false

firefox disable prefetching

1条评论

  1. 我是firefox忠实用户
    不过对于大众来说,现在用chrome的人更多些

评论已关闭。