Apache Rewrite规则问题:移除PHP扩展名并获取查询字符串
修复Apache Rewrite规则以保留查询字符串
你的核心问题是重写规则未明确确保查询字符串传递到目标PHP文件,调整规则并添加QSA(Query String Append)标志即可解决,同时可兼顾带/不带尾部斜杠的URL需求。
调整后的.htaccess配置
RewriteEngine On # 外部重定向:移除.php扩展名,将 /test.php?lang=en 重定向到 /test/,保留查询参数 RewriteCond %{THE_REQUEST} \s/+(.+?)\.php(\?.*)?\s [NC] RewriteRule ^ /%1/ [R=307,NE,QSA,L] # 可选:强制为非文件请求添加尾部斜杠(不需要可直接删除此段) RewriteCond %{REQUEST_FILENAME} !-f RewriteRule [^/]$ %{REQUEST_URI}/ [R=307,NE,QSA,L] # 内部重写:带尾部斜杠的URL映射到对应.php文件,保留查询参数 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.+)/$ $1.php [QSA,L] # 内部重写:不带尾部斜杠的URL映射到对应.php文件,保留查询参数 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.+)$ $1.php [QSA,L]
关键修改点
- 添加
QSA标志:在所有重定向和内部重写规则中加入QSA,确保查询字符串被完整传递到目标PHP文件,$_GET['lang']、$_GET['id']等参数可正常捕获。 - 扩展重定向规则的正则匹配:让第一条规则能正确识别带查询字符串的
.php请求,避免参数丢失。 - 支持无尾部斜杠的URL:新增内部重写规则,直接处理
/test?lang=en这类格式的请求,无需强制跳转,满足“尾部斜杠可省略”的需求。
测试验证
- 访问
https://example.com/test.php?lang=en&id=3→ 自动重定向到https://example.com/test/?lang=en&id=3,内部映射到test.php,参数可正常读取。 - 访问
https://example.com/test?lang=en&id=3→ 直接内部映射到test.php,无额外跳转,参数正常捕获。 - 访问
https://example.com/test/或https://example.com/test→ 均能正确映射到test.php。
可选优化
如果不需要强制添加尾部斜杠,直接删除第二条重定向规则即可,此时所有URL格式(带/不带.php、带/不带尾部斜杠)都能正常工作,且查询参数全程保留。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

