htaccess Rewrite规则在文件存在时失效,需强制重写至指定文件
解决Apache Rewrite规则强制跳转问题
你的问题核心是存在的文件会绕过Rewrite规则直接响应,这是Apache默认行为导致的——当请求路径对应实际存在的文件时,Apache会直接返回该文件,不执行后续Rewrite规则。要实现所有请求无论文件是否存在都跳转到authorize.php,可以按以下方式修改规则:
RewriteEngine On # 排除目标文件本身,避免无限循环重写 RewriteCond %{REQUEST_URI} !^/authorize\.php$ # 匹配所有请求路径,自动合并查询参数 RewriteRule ^(.*)$ authorize.php?f=$1 [L,QSA]
关键修改说明:
- 添加
RewriteCond %{REQUEST_URI} !^/authorize\.php$:排除对authorize.php自身的请求,防止出现无限循环重写的问题。 - 使用
QSA(Query String Append)flag:自动将原始请求的查询参数合并到新的URL中,比手动拼接%{QUERY_STRING}更稳定,避免参数冲突。 - 简化匹配规则
^(.*)$:匹配所有请求路径(包括带后缀的文件路径),确保覆盖所有场景。
测试验证:
- 请求
http://domain/sample2.pdf(文件不存在):正常跳转到authorize.php?f=sample2.pdf - 请求
http://domain/sample.pdf(文件存在):同样跳转到authorize.php?f=sample.pdf,不会直接打开原文件 - 带查询参数的请求(如
http://domain/test.html?id=123):会跳转至authorize.php?f=test.html&id=123,参数完整保留
内容的提问来源于stack exchange,提问作者Filip Popović
相关产品推荐
相关产品推荐

