.htaccess Hotlink禁用无法正常工作

时间:2012-11-10 09:53:24

标签: .htaccess mod-rewrite referrer hotlinking

我有以下代码段:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://%{SERVER_NAME}/
RewriteRule \.(js|css|png|jpg) - [R=404,L]

简单,应该正常工作吗?如果我在浏览器上启用了引用,似乎404列出的文件类型。然后禁用引用,然后允许提供文件。我检查了%{SERVER_NAME}的值,它是www.mydomain.com我已经在多个浏览器中测试了这个,在HTTP和HTTPS下,都有相同的结果。我使用下面的重写来检查%{SERVER_NAME}的值:

RewriteRule servername value_is_%{SERVER_NAME} [R=301,L]

我被重定向到的网址是https://www.mydomain.com/value_is_www.mydomain.com

据说,该代码段应该允许具有该值或空值的引荐来源。但为什么会被触发呢?在过去的两个小时里,它一直让我疯狂,但现在是早上5点,所以我可能只是疯了= o \提前谢谢你,我要去睡觉了!

1 个答案:

答案 0 :(得分:1)

问题是,你不能在条件模式中使用变量(好吧,至少在Apache 2.4之前),因为模式在服务器启动期间被预编译。

但是,对于您的特定问题,您可以使用一种简单的解决方法来模仿这种情况:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{SERVER_NAME}%{HTTP_REFERER} !^(.*)https?://\1/
RewriteRule \.(js|css|png|jpg) - [R=404,L]
是的,就是这样。你不能使用变量,但肯定可以使用反向引用。

哦......顺便说一下。 Apache 2.4附带了可以用来代替条件模式的表达式:

 RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"