好吧,我已经绞尽脑汁想了几个小时,但还是不行。下面是我的 .htaccess 文件的内容。我想做的是阻止对我网站上的一组 pdf 和 mp3 文件的访问,除非用户通过我网站页面上的链接点击这些文件。
我查看过的所有地方的代码都与我使用的代码基本相同,但就是不起作用。我的问题是:
1) 我做错了什么吗? 2) 如果没有,我该如何调试它?
# BEGIN CustomRedirects
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mydomain.com/.*$ [NC]
RewriteRule \.(mp3|pdf)$ - [F,NC,L]
# END CustomRedirects
mp3 和 pdf 不区分大小写,并且启用了 mod_rewrite。我的网站上安装了 Wordpress,但它在树中的目录比此 .htaccess 文件高。从文档中我得到的印象是我的 .htaccess 文件应该优先,因为它位于我希望进行此重写的目录中。如果我把这个 .htaccess 文件搞得一团糟,就会出现错误 500,所以我只能假设它在某个时候被读取了。
我还尝试了以下步骤,这是我从另一个 serverfault 问题中找到的,但也不起作用:
SetEnvIf Referer . hotlink=1
SetEnvIfNoCase Referer ^http://(www\.)?mydomain\.com/.*$ !hotlink
<LocationMatch *.pdf>
Order allow,deny
Deny from env=hotlink
Allow from all
</LocationMatch>
有人有主意吗?
更新: 我还尝试了以下 RewriteRule,但没有效果。
RewriteRule .*\.(mp3|pdf)$ - [F,NC,L]
我发现,如果我省略该RewriteCond %{HTTP_REFERER} !^$
部分,它工作正常,但有人仍然可以直接输入 URL 并获取文件。这也是我想防止的事情。
答案1
第一个摘录的问题可能是 RewriteRule 行。
你有:
RewriteRule \.(mp3|pdf)$ - [F,NC,L]
也许你想要:
RewriteRule .*\.(mp3|pdf)$ - [F,NC,L]
照这样看来,我认为您匹配的是特定文件“.mp3”或“.pdf”。您想要匹配“foo.mp3”或“bar.pdf”(用于改变 foo 和 bar)。
在第二段摘录中,开头看起来有点可疑。我不知道为什么需要 SetEnvIf 和 SetEnvIfNoCase 组合。也许可以尝试以下方法:
SetEnvIf Referer "^http://(www\.)?mydomain.com/.*$" legit_referal
SetEnvIf Referer "^$" legit_referal
<LocationMatch "\.(pdf|mp3)$" >
Order Deny,Allow
Deny from all
Allow from env=legit_referal
</LocationMatch>
答案2
您所描述的情况绝对是可能的。如果引荐来源与您自己的域名不匹配,您很容易返回 403 禁止状态。
您也可以考虑这个选项:http://www.alistapart.com/articles/hotlinking/
关于您当前的代码,我注意到您错误地错过了反斜杠 \ 来转义 .我的域名。