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

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

我想在我的服务器上链接图像链接。 这意味着,如果有人试图从另一台服务器链接到我的服务器的图像,他不应该看到链接的图像,而是一个替代的图像(一个图像写着:“图像链接是forbitten!”)。
不幸的是,它根本不起作用:原始图像显示在远程服务器上,或者在我自己的服务器上甚至会显示出这个图像,尽pipe我从来没有用完整的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;"/> 

那么这里有什么问题?

我怀疑Referer不匹配,所以你应该使用RewriteLoglogging重写动作,或使用FirebugvalidationHTTP 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] 

如果我理解你的规则,你可以这样做:

… 我会做:

 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] 

注意:第二个重写规则仅仅意味着“如果引用者不包含"en/pictures/drawings/" ,这对你来说应该是足够的,而且如果你使用https一天仍然可以工作。

不要忘记RewriteRule中的"L" ,停止继续。 除非你真的需要redirect,否则你可以直接使用RewriteRule:

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

因为你所做的是redirect。 redirect意味着新的交换。 用以前的规则,你不会有这个。 客户端(这将得到一个redirect,所以重新要求新的图片)和服务器(这将获得另一个请求重写的图片(“禁止的图片”)之间将不会有额外的(和无用的)交换) 。

总结:

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

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

希望这可以帮助。