.htaccess配置重定向至index.php丢失查询字符串问题求助
解决.htaccess重定向到index.php后查询字符串丢失的问题
嗨,这个问题我之前碰到好多次了——你说的情况完全符合RewriteRule没有传递查询字符串的典型表现:REQUEST_URI里能看到完整的?name=stackoverflow,但QUERY_STRING和$_GET都为空,核心原因就是重写规则没把原请求的查询串带过去。
最常见的问题:缺少QSA标志
你大概率是写了类似这样的规则:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [L]
这个规则会把所有非文件非目录的请求转发到index.php,但默认不会自动保留原查询字符串,所以?name=stackoverflow就被丢弃了。
正确的配置:加上QSA标志
只需要在RewriteRule的标志里加上QSA(Query String Append),它会自动把原请求的查询字符串追加到目标URL后面:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [L,QSA]
QSA的作用是:如果原请求有查询串,就把它拼到index.php的查询串后面;如果index.php本身也带查询参数(比如index.php?foo=bar),还会自动合并两个查询串(变成index.php?foo=bar&name=stackoverflow)。
其他可能的排查方向
如果加了QSA还是不行,那得检查这几个点:
- 有没有其他RewriteCond规则意外清空了查询字符串?比如有没有写过
RewriteCond %{QUERY_STRING} ^$这类限制,或者用RewriteRule ... index.php?(末尾的?会主动清空查询串) - 确认Apache的mod_rewrite模块已经启用(LAMP环境一般默认启用,但可以通过
phpinfo()查看mod_rewrite是否在Loaded Modules里) - 检查.htaccess文件是否被Apache允许:确保虚拟主机配置里的
AllowOverride设置为All或者FileInfo,否则.htaccess的规则不会生效
验证方法
修改完配置后,直接在index.php里打印这些变量测试:
<?php echo "QUERY_STRING: " . $_SERVER['QUERY_STRING'] . "<br>"; print_r($_GET); ?>
访问http://example.com/hello/user?name=stackoverflow,如果能看到QUERY_STRING: name=stackoverflow和Array ( [name] => stackoverflow ),就说明问题解决了。
内容的提问来源于stack exchange,提问作者JohnnyAce
相关产品推荐
相关产品推荐

