Apache mod_rewrite规则的HTTP序列

我正在尝试在.htaccess中创build一个规则集,根据HTTP_REFERER值对URL进行不同的处理。 有些东西不像预期的那样工作,我不确定问题是句法还是逻辑。

简而言之,对于特定目录下的所有文件,如果HTTP_REFERER来自同一个域,那么我希望它们能够直接提供服务;如果是空白域或其他域,则将其redirect到脚本。 我拥有的:

RewriteCond %{HTTP_REFERER} !^https://%{HTTP_HOST}.*$ RewriteRule ^/mydir/(.+)$ /incl/serve_content.php?c=$1 [L] 

该网站只有HTTPS,所以https条件应该足够了。 我得到的是,规则似乎从来没有匹配。 我错过了什么?

编辑

经过更多的debugging之后,看起来这个规则甚至没有被检查,在RewriteLog指令创build的日志文件中没有提及匹配和不匹配。 为什么不检查它呢?

编辑 .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] 

当你使用mod_rewrite时,最重要的指令是

  RewriteLog /path/to/apachelogs/rewrite.log RewriteLogLevel 9 

这会给你大量的debugging信息。 如果你添加这些行,然后看看debugging日志,你应该find到底是怎么回事,并希望得到一些提示为什么。

该规则将永远不会匹配,因为您在.htaccess文件中使用了前导斜杠。 试试这个:

 RewriteRule ^mydir/(.+)$ incl/serve_content.php?c=$1 [L] 

顺便说一句,如果你有权访问服务器configuration, 你不应该使用.htaccess