如何正确防止.htaccess热链接?

时间:2015-03-24 17:22:48

标签: .htaccess

我的.htaccess中有以下行,以防止直接访问各种文件类型:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com/.*$   [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com$      [NC]
RewriteRule .*\.(jpg|jpeg|png|gif|bmp|css|ini|db|js)$ - [F,NC]

并且它有效,即如果我尝试访问文件http://example.com/test.png,它将生成403 Forbidden Error页面。

BUT,... 我发现如果我用一个斜杠(http://example.com/test.png/)键入地址,它将在浏览器中显示test.png文件。实际上,通过访问http://example.com/test.png/ANYTHING_HERE形式的任何网址,它将在浏览器中显示test.png。

为什么?以及如何预防?

感谢。

1 个答案:

答案 0 :(得分:0)

如果在请求结束时有斜杠,那么apache会将其作为PATH INFO的一部分。出于某种原因,您的服务器设置为甚至处理非脚本实体以接受资源之后的路径(可能是因为您的处理程序?)。

通常,对于脚本,如果您有这样的URL:

http://example.com/path/script.php/this/is/path/info

script.php脚本可以通过查看$_SERVER['PATH_INFO']变量来访问路径信息,并查看其中的/this/is/path/info

由于您的图片不是脚本,因此路径的这一部分会被丢弃并且您的图片会被提供。您需要像这样调整正则表达式:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com/.*$   [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com$      [NC]
RewriteRule .*\.(jpg|jpeg|png|gif|bmp|css|ini|db|js)(?:/.*|)$ - [F,NC]