1

我有以下片段:

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]

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

话虽这么说,该片段应该允许具有该值的引荐来源网址或空引荐来源网址。但是为什么会触发呢?在过去的 2 个小时里一直让我发疯,但现在是凌晨 5 点,所以我可能只是疯了 =o\ 提前谢谢你,我要去睡觉了!

4

1 回答 1

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}/*'"
于 2012-11-10T22:25:15.250 回答