You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写.htaccess实现目录级URL重写并保留原查询字符串

问题原因

Apache mod_rewrite 的RewriteRule默认规则下,如果重写目标本身携带查询参数,会直接丢弃原始请求自带的查询字符串,这就是你拿不到原有参数的原因。


方案1:自动合并原始查询参数到$_GET(推荐)

如果你不需要单独的query_string参数,只是要原有参数能直接通过$_GET获取,只需要给规则加上QSA(Query String Append,查询字符串追加)标志和L(匹配后停止后续规则)标志即可:

RewriteEngine On
RewriteRule ^([a-z0-9\-]+)$ ?service=$1 [QSA,L]
RewriteRule ^([a-z0-9\-]+)/([a-z]+)$ ?service=$1&file=$2 [QSA,L]

配置后请求https://example.com/subdir/gulp-service/category?parent=666&name=test会被重写为?service=gulp-service&file=category&parent=666&name=test,PHP中可以直接通过$_GET['parent']、$_GET['name']拿到对应值。


方案2:单独拼接query_string参数

如果你严格需要按照需求把原始查询串作为单独的query_string参数传递,可以调用Apache内置的%{QUERY_STRING}变量手动拼接:

RewriteEngine On
# 单段路径带查询参数的情况
RewriteCond %{QUERY_STRING} .+
RewriteRule ^([a-z0-9\-]+)$ ?service=$1&query_string=%{QUERY_STRING} [L]
# 单段路径无查询参数的情况
RewriteRule ^([a-z0-9\-]+)$ ?service=$1 [L]

# 两段路径带查询参数的情况
RewriteCond %{QUERY_STRING} .+
RewriteRule ^([a-z0-9\-]+)/([a-z]+)$ ?service=$1&file=$2&query_string=%{QUERY_STRING} [L]
# 两段路径无查询参数的情况
RewriteRule ^([a-z0-9\-]+)/([a-z]+)$ ?service=$1&file=$2 [L]

注意:该方案下原有查询参数不会自动加入$_GET,需要自行解析$_GET['query_string']获取原始参数。


内容的提问来源于stack exchange,提问作者Daniel Galecki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:27:08