我正在尝试在 .htaccess 中创建一个规则集,该规则集将根据 HTTP_REFERER 值以不同的方式处理 URL。有些事情没有按预期进行,我不确定问题是语法问题还是逻辑问题。
简单来说,对于特定目录下的所有文件,如果 HTTP_REFERER 来自同一个域,我希望直接提供这些文件,如果 HTTP_REFERER 为空或其他域,则重定向到脚本。我有:
RewriteCond %{HTTP_REFERER} !^https://%{HTTP_HOST}.*$
RewriteRule ^/mydir/(.+)$ /incl/serve_content.php?c=$1 [L]
该网站仅支持 HTTPS,因此https条件应该足够了。但我得到的是规则似乎永远不匹配。我遗漏了什么?
编辑
经过更多调试后,似乎这条规则根本就没有被检查,RewriteLog 指令创建的日志文件中没有提到匹配或不匹配。为什么不检查它呢?
编辑该文件的完整内容.htaccess
:
ErrorDocument 404 /incl/404.php
AddType application/octet-stream .csv
AddType application/vnd.openxmlformats-officedocument.spreadsheetml.sheet .xlsx
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]
RewriteCond %{HTTP_REFERER} !^https://%{HTTP_HOST}.*$
RewriteRule ^/mydir/(.+)$ /incl/serve_content.php?c=$1 [L]
RewriteBase /
RewriteRule ^final/([A-Za-z0-9_\.]+)$ incl/serve_final.php?c=$1 [QSA]
RewriteRule ^quiz/([A-Za-z0-9_\.]+)/([0-9]+)$ incl/serve_quiz.php?c=$1&q=$2 [QSA]
答案1
使用 mod_rewrite 时,最重要的指令是
RewriteLog /path/to/apachelogs/rewrite.log
RewriteLogLevel 9
这将为您提供大量的调试信息。如果您添加这些行,然后查看调试日志,您应该会发现到底发生了什么,并希望得到一些提示。
答案2
由于您在文件中使用了前导斜杠,因此规则永远不会匹配.htaccess
。请尝试以下方法:
RewriteRule ^mydir/(.+)$ incl/serve_content.php?c=$1 [L]
顺便说一句,如果你有权访问服务器配置,你不应该使用.htaccess
。