<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Syu&#39;s Blog</title>
    <link>https://syu.im/</link>
    
    <image>
      <url>https://syu.im/images/icon/favicon.ico</url>
      <title>Syu&#39;s Blog</title>
      <link>https://syu.im/</link>
    </image>
    
    <atom:link href="https://syu.im/rss.xml" rel="self" type="application/rss+xml"/>
    
    <description>标准程序员，会一点点Java和Python，喜欢折腾。欢迎来到我的博客，分享技术笔记与折腾记录。</description>
    <pubDate>Mon, 15 Jun 2026 05:16:07 GMT</pubDate>
    <generator>http://hexo.io/</generator>
    
    <item>
      <title>解决少数派图片防盗链</title>
      <link>https://syu.im/Docker/%E8%A7%A3%E5%86%B3%E5%B0%91%E6%95%B0%E6%B4%BE%E5%9B%BE%E7%89%87%E9%98%B2%E7%9B%97%E9%93%BE/</link>
      <guid>https://syu.im/Docker/%E8%A7%A3%E5%86%B3%E5%B0%91%E6%95%B0%E6%B4%BE%E5%9B%BE%E7%89%87%E9%98%B2%E7%9B%97%E9%93%BE/</guid>
      <pubDate>Fri, 23 May 2025 08:36:06 GMT</pubDate>
      
      <description>通过修改ImageProxy插件解决少数派图片防盗链，适用于任何需要代理的网站</description>
      
      
      
      <content:encoded><![CDATA[<p><a href="https://cdn.syu.im/840x277_1777001326394.webp" data-fancybox="post" target="_self"><img class="lazyload" srcset="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAABlBMVEXMzMyWlpYU2uzLAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAACklEQVQImWNgAAAAAgAB9HFkpgAAAABJRU5ErkJggg==" data-srcset="https://cdn.syu.im/840x277_1777001326394.webp" decoding="async" style="--aspect-ratio:840/277;"></a></p><h2 id="背景："><a href="#背景：" class="headerlink" title="背景："></a>背景：</h2><p>自己一直用Rsshub+Freshrss+Reeder来获取资讯，其中包括少数派。之前用的官方的Rss,发现他只给预览部分内容了，于是换Rsshub给的feed，正常了一阵子。 好景不常，前一段时间发现少数派的图片又展示不全了，估计又在搞事了。搜了一圈，发现最大的问题可能就是加了防盗链了。</p><p>一般网站的图片的防盗链策略基本就是：主站+no-refer，但是少数派为了给自己的网站和app引流确实费劲心思了，去掉了no-refer，只允许refer是 sspai.com 了。而Rsshub抓取网站的图片默认都是no-refer.</p><h2 id="怎么解决呢："><a href="#怎么解决呢：" class="headerlink" title="怎么解决呢："></a>怎么解决呢：</h2><p>在往上搜了一圈之后，发现Fressrss的<a href="https://github.com/FreshRSS/Extensions">插件库</a>里面有ImageProxy和<a href="https://github.com/Victrid/freshrss-image-cache-plugin">ImageCache</a>能解决这个问题，但是自用不需要缓存图片这种开销比较大的操作，所以选择了ImageProxy.</p><p>根据各种资料，在Vps上面搭建了一个反代地址，部分代码如下：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">map $arg_path $new_referer &#123;</span><br><span class="line">  default &quot;&quot;;</span><br><span class="line">  &quot;~*sspai\.com&quot; &quot;https://sspai.com&quot;;</span><br><span class="line">  # insert here</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">server &#123;</span><br><span class="line">    listen  443 ssl;</span><br><span class="line">    http2 on;</span><br><span class="line">    root   /config/www;</span><br><span class="line"></span><br><span class="line">    ssl_certificate /config/keys/full.pem;</span><br><span class="line">    ssl_certificate_key /config/keys/key.pem;</span><br><span class="line"></span><br><span class="line">    location /proxy &#123;</span><br><span class="line">      if ($request_uri ~* &quot;^/proxy\?path=(.*)&quot;) &#123;</span><br><span class="line">          set $destination $1;</span><br><span class="line">      &#125;</span><br><span class="line">      if ($new_referer = &quot;&quot;) &#123;</span><br><span class="line">        return 302 $destination;</span><br><span class="line">      &#125;</span><br><span class="line"></span><br><span class="line">      proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line">      proxy_set_header X-Forwarded-Proto $scheme;</span><br><span class="line">      proxy_set_header X-NginX-Proxy true;</span><br><span class="line">      proxy_set_header Referer $new_referer;</span><br><span class="line">      proxy_pass $arg_path;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="关键点："><a href="#关键点：" class="headerlink" title="关键点："></a>关键点：</h3><p>#1.map配置 图片链接正则匹配到sspai.com之后 新的refer就是sspai.com<br>#2.反代配置 如果map没匹配到需要反代的域名直接302访问原始图片链接， 如果匹配到了，就在header里面修改新的Referer，然后用的是Vps访问链接。<br>#3.最后在Freshrss里面配置插件，地址为Vps地址或者域名，后缀加上&#x2F;proxy?path&#x3D;<br><a href="https://cdn.syu.im/765x780_1777001466406.webp" data-fancybox="post" target="_self"><img class="lazyload" srcset="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAABlBMVEXMzMyWlpYU2uzLAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAACklEQVQImWNgAAAAAgAB9HFkpgAAAABJRU5ErkJggg==" data-srcset="https://cdn.syu.im/765x780_1777001466406.webp" decoding="async" style="--aspect-ratio:765/780;"></a></p><p>到这，Freshrss里面打开少数派的Feed，图片就能正常展示了。</p><h2 id="但是。。。。。。。"><a href="#但是。。。。。。。" class="headerlink" title="但是。。。。。。。"></a>但是。。。。。。。</h2><p>一般都用手机Reeder访问Freshrss，手机上面打开的时候却不生效，这是为什么呢？结合上面说的有两个插件，一个是ImageProxy一个是ImageCache，看了ImageCache的Github里面的用户访问时序图。<br><a href="https://cdn.syu.im/552x530_1777001489555.webp" data-fancybox="post" target="_self"><img class="lazyload" srcset="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAABlBMVEXMzMyWlpYU2uzLAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAACklEQVQImWNgAAAAAgAB9HFkpgAAAABJRU5ErkJggg==" data-srcset="https://cdn.syu.im/552x530_1777001489555.webp" decoding="async" style="--aspect-ratio:552/530;"></a></p><p>发现这个插件在客户端访问的时候可以直接读取cache而不是读取Freshrss，于是对比了下两个插件的代码，发现主要的区别在于Hook.<br><a href="https://cdn.syu.im/1551x387_1777001506529.webp" data-fancybox="post" target="_self"><img class="lazyload" srcset="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAABlBMVEXMzMyWlpYU2uzLAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAACklEQVQImWNgAAAAAgAB9HFkpgAAAABJRU5ErkJggg==" data-srcset="https://cdn.syu.im/1551x387_1777001506529.webp" decoding="async" style="--aspect-ratio:1551/387;"></a></p><p>ImageProxy插件是在展示前调用，而ImageCache是在插入Freshrss数据库之前，先将图片上传到配置的路径，然后不修改内容，但是在展示的时候，再查询缓存的地址。虽然两个插件都不能在其他App直接展示图片，但是ImageCache的entry_before_insert Hook引起我的注意。根据语义可以得知，在feed解析后，每篇文章都会插入数据库。然后查证了Freshrss的数据库，果然，entry表里面的content字段存了最原始的Rsshub返回的内容。<br>这也就解释了为啥其他App读取的时候，代理的图片还是不生效的问题，因为插件根本没有修改原始数据，只是在浏览器访问Freshrss的时候，Feed展示前插件才会工作。</p><h3 id="进一步修改："><a href="#进一步修改：" class="headerlink" title="进一步修改："></a>进一步修改：</h3><p>将ImageProxy插件的Hook从entry_before_display改为entry_before_insert，保存并重启Freshrss,等待下一次刷新Feed的时候，发现数据库里面的Content内容里面所有Img标签的src属性都变成了反代地址+原始图片链接。至此，所有App访问Freshrss之后都能展示图片了。</p><blockquote><p>ps：这样做也有一个缺点，你的反代服务器需要一直在线，如果不能访问了，文章中所有图片也都失效了，包含不需要反代的。</p></blockquote><p>Ref: <a href="https://undefapp.com/freshrss-jie-jue-sspai-tu-pian-fang-dao-lian-wen-ti">Link1</a> | <a href="https://renyili.org/post/%E8%A7%A3%E5%86%B3ios%E7%AB%AF%E5%B0%91%E6%95%B0%E6%B4%BErss%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD%E5%A4%B1%E8%B4%A5%E9%97%AE%E9%A2%98/">Link2</a> | <a href="https://flowus.cn/share/822c6b09-715d-47f6-8b49-d9fa3804e235">Link3</a></p>]]></content:encoded>
      
      
      <category domain="https://syu.im/categories/RSS/">RSS</category>
      
      
      <category domain="https://syu.im/tags/sspai/">sspai</category>
      
      <category domain="https://syu.im/tags/freshrss/">freshrss</category>
      
      
      <comments>https://syu.im/Docker/%E8%A7%A3%E5%86%B3%E5%B0%91%E6%95%B0%E6%B4%BE%E5%9B%BE%E7%89%87%E9%98%B2%E7%9B%97%E9%93%BE/#disqus_thread</comments>
      
    </item>
    
  </channel>
</rss>
