重写规则以禁止来自另一台服务器的图像链接

重写规则以禁止来自另一台服务器的图像链接

可能重复:
如何防止我的网站上的资源热链接(“图像盗窃”/“带宽盗窃”)?

我想禁止我的服务器上的图像链接。这意味着如果有人试图从另一台服务器链接到我的服务器上的图像,他不应该看到链接的图像,而应该看到另一幅图像(带有文字“禁止图像链接!”的图像)。
不幸的是,它根本不起作用:要么原始图像显示在远程服务器上,要么被禁止的图像甚至显示在我自己的服务器上,尽管我从未使用完整 URL 调用我的图像:

Options -Indexes 
RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www.my-domain.net/en/pictures/drawings/.*$ [NC]
RewriteRule .*\.(png|PNG)$ http://www.my-domain.net/pics/linkingpicsforbitten.png [R]

如果我这样做,我总是会得到 linkingpicsforbitten.png 图像,即使在我自己的服务器上,尽管我像这样调用我的图片:

<img class="pictures" src="drawings/myoriginalpic.png" alt="original pic" style="width:640px; height:466px;"/>

那么这里到底出了什么问题?

答案1

我怀疑Referer不匹配,所以你应该用RewriteLog或者使用 Firebug 来验证 HTTP referer。

尝试这样的操作:

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?my-domain\.net/.*$ [NC]
RewriteRule .*\.(gif|jpe?g|png)$ http://www.my-domain.net/pics/linkingpicsforbitten.png [R,NC,L]

答案2

如果我理解你的规则,你应该这样做:

... 我会做:

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !en/pictures/drawings/ [NC]
RewriteRule .*\.(png|PNG)$ http://www.my-domain.net/pics/linkingpicsforbitten.png [R,L]

注意:第二条重写规则只是意味着“如果 referer 不包含"en/pictures/drawings/",这对您来说应该足够了,并且如果您使用https一天,它仍然可以工作。

不要忘记"L"RewriteRule 中的,以停止进一步的操作。除非您确实需要进行重定向,否则您可以改为执行此 RewriteRule:

RewriteRule .*\.(png|PNG)$ /pics/linkingpicsforbitten.png [L]

因为您所做的是重定向。重定向意味着新的交换。使用上一条规则,您不会遇到这种情况。客户端(将获得重定向,因此重新请求新图片)和服务器(将获得对重写图片(“禁止图片”)的另一个请求)之间不会有额外的(无用的)交换。

总结一下:

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !en/pictures/drawings/ [NC]
RewriteRule .*\.(png|PNG)$ /pics/linkingpicsforbitten.png [L]

这更简短,更高效,更清晰。

希望这可以帮助。

相关内容