Apache mod_rewrite HTTP 规则序列

Apache mod_rewrite HTTP 规则序列

我正在尝试在 .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

相关内容