我有以下代码段:
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 \提前谢谢你,我要去睡觉了!
答案 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}/*'"