我正在尝试编写“终极”反热链接.htaccess......
你可以找到很多示例/教程/发电机但其中很多都是错误的或不完整的(甚至两者兼而有之)。
这些是我正在寻找的功能:
- 当 HTTP_REFERER 是外部站点时,必须阻止文件扩展名列表的热链接。
- 必须允许当前域的热链接(duh)而不在 .htaccess 中对其进行硬编码。
- 对于当前域,它必须在 http 和 https 下工作。
- 对于当前域名,它必须与 www 一起使用,也可以与不带 www 一起使用。
- 必须能够向这些规则添加例外域(例如我们的朋友 Google),并且这些域必须在 http 和 https 下以及带有 www 或不带有 www 的情况下工作。
这是我目前所取得的成就:
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?mydomain.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com/.*$ [NC]
RewriteRule \.(gif|jpe?g|png|zipx?)$ - [NC,F]
</IfModule>
我的问题:
- 如何避免
mydomain.com
在 .htaccess 中进行硬编码?(如果能够将此 .htaccess 部署到我的所有域而不必为每个域进行修改,那就太好了。) - 在我的 RewriteRule 中,
gif|jpe?g|png|zipx?
相当于gif|jpg|jpeg|png|zip|zipx
对吗?(抱歉,我对正则表达式还不熟悉。) - 您是否发现我的 .htaccess 中存在我不知道的错误?
对于 #1,我知道这在某种程度上是可能的。我发现最接近的是从 URL 中删除 www 的代码片段,而无需对域名进行硬编码。有没有办法将此方法用于我的问题 #1?
RewriteCond %{HTTP_HOST} ^www\.(.+)
RewriteCond %{HTTPS}s/%1 ^(on(s)|offs)/(.+)
RewriteRule ^ http%2://%3%{REQUEST_URI} [L,R=301]
更新:
我知道有些解决方案会提供带水印的图片而不是普通图片。但我不是在寻找这种解决方案。我想要一个普遍的解决方案(提供 403 错误)适用于所有类型的二进制文件(zip、exe、iso、jpg、png、gif……)。
答案1
不管你做什么,你都会“浪费”CPU 周期(为了确定引荐来源网站(进行链接的网站)是否获得授权,你必须对请求数据进行一些处理)。
你唯一能做的就是节省带宽,同时浪费最低限度CPU 周期。
有Apache Docs 中的一些示例可以完全满足您的要求。下面这个:
SetEnvIf Referer example\.com localreferer
<FilesMatch \.(jpg|png|gif)$>
Order deny,allow
Deny from all
Allow from env=localreferer
</FilesMatch>
似乎是最适用的(并且不需要 mod_rewrite 的全部权重)。
您可以使用附加SetEnvIf
和Allow
指令添加其他有效引用。
答案2
如何编写一条规则,如果 referer 未知(或被禁止),则只需调用一个 Php 文件,将图像作为参数传递,然后在 Php 文件中用大红色输入:“此文件来自 MYWEBSITE.COM 并且没有官方授权在此处显示”。
至于你的问题,请将你的规则设为全局规则。如果我错了,请纠正我,但如果规则被声明前它将应用于任何 vhost 上的所有 vhost(一种“默认规则”)。
另一个想法很简单:只需重定向到一个 Php 文件(此处filter.php
),该文件将查看授权网站,如果一切正常则返回所需的文件:
RewriteRule /(.*)\.jpg$ /filter.php?im=$2\.jpg [QSA,L]
只需filter.php
动态加载 vhost 列表或类似的东西:
if (isset($_SERVER['HTTP_HOST'])) {
if ((mb_ereg('thereferers\.I\.HATE\.com',HOST) !== false) ) {
... your code ...
}
}
答案3
Cloudflare 可能会对你有所帮助: http://www.cloudflare.com
然而,这只适用于图像,但这似乎就是您所追求的。
热链接保护
自动为您的图片启用热链接保护,以防止站外链接。不在区域内且非空白的引荐来源将被拒绝访问。支持的文件扩展名有 gif、ico、jpg、jpeg 和 png。
受保护:http://mydomain.com/images/pic.jpg 绕过方法:http://mydomain.com/images/hotlink-ok/pic.jpg
答案4
或者使用CoralCDN让人们随心所欲地进行热链接吗?