解决hexo引入图床,手机和web不显示图片的问题


问题情景

使用hexo博客,写了一篇带图的文章,结果发现图挂了…之前看博客扫到hexo博客显示本地图片可能会有问题,于是选了图床图片的方式插图,结果还是没能幸免,好在搜索了半天,解决了这个问题,这里做个记录,帮助后面遇到问题的同学。

Hexo使用图床的方式加载在blog中加载图片,会在非本人的电脑或者手机端报“html访问图片资源403问题(http referrer)”,导致采用图床方式加载的图片全部无法加载。

解决步骤

分析:

  1. 检查图床图片的链接:

    点进去发现图片正常显示,排除图床服务器问题。

  2. 用Chrome打开博文,右键检查或者查看网页源码:

    找到图床图片链接,点击发生403(Forbidden)错误,找到问题根源。

解决:

403 forbidden,说明了这个网络资源这样获取是被拒绝的,那么通过简单的谷歌,找到了相关的解决方法,并去实际尝试:

解决方法 :只需要在markdown文章开头添加一个<meta name="referrer" content="no-referrer" />

如果上述方式不起作用的话,可能需要全局去添加。

butterfly主题

文件路径参考自己安装路径

在G:\blog\themes\butterfly\layout\includes目录下有一个head.pug文件,修改该文件的meta信息,会使生成的所有页面都带有该head。在head.pug文件中添加如下内容,结果参见图片。

meta(name="referrer" content="no-referrer")

添加的内容

yilia主题

在G:\blog\themes\yilia\layout_partial目录下有一个head.ejs,同样在head.ejs文件中添加如下meta信息即可

<meta name="referrer" content="no-referrer" />

然后就是hexo clean && hexo g && hexo d上传博客了,这一次分别在电脑和手机端打开文章,图片显示正常,问题解决。

在G:\blog\public\2023目录下就是所有23年生成的blog,找到该目录下的任意一个index.html,用文本编辑器打开就可以看到已经自动生成了referrer标签了。

原理解析

http请求体的header中有一个referrer字段,用来表示发起http请求的源地址信息,这个referrer信息是可以省略但是不可修改的,就是说你只能设置是否带上这个referrer信息,不能定制referrer里面的值。

服务器端在拿到这个referrer值后就可以进行相关的处理,比如图片资源,可以通过referrer值判断请求是否来自本站,若不是则返回403或者重定向返回其他信息,从而实现图片的防盗链。上面出现403就是因为,请求的是别人服务器上的资源,但把自己的referrer信息带过去了,被对方服务器拦截返回了403。

在前端可以通过meta来设置referrer policy(来源策略),具体可以设置哪些值以及对应的结果参考这里。所以针对上面的403情况的解决方法,就是把referrer设置成no-referrer,这样发送请求不会带上referrer信息,对方服务器也就无法拦截了。

浏览器中referrer默认的值是no-referrer-when-downgrade,就是除了降级请求的情况以外都会带上referrer信息。降级请求是指https协议的地址去请求http协议,所以上面403的情况还有另一种解决方法就是,请求的图片地址换成http协议,自己的地址使用http协议,这样降级请求也不会带上referrer。

简单的说 :

  1. HTML的 标签提供了 HTML 文档的元数据。元数据不会显示在客户端,但是会被浏览器解析。这也是为什么加在mardown文章里不会看到这段代码的原因。
  2. HTML 的 name 属性规定了元数据的名称,这里我们用到的是referer属性,这个属性的作用是让服务器判断来源页面,即用户是从哪来的,很多时候referer被当做防盗链来使用,服务器根据你的访问来源判断是否应该让你下载这个资源,如果你的来源不和规范,比如是个恶意爬虫,那么就会产生403错误。
  3. 到这里,content="no-referrer"的意义就呼之欲出了,既然我们想拿到这个资源但被服务器认出来之后又被拒绝了,那么伪装一下,不告诉服务器不就行了?所以,这里content的no-referer就是表示不发送引用数据,隐藏自己的来源信息。这样,图片就能正常显示了。

参考


文章作者: 冬瓜冬瓜排骨汤
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 冬瓜冬瓜排骨汤 !
  目录