如何编写.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
相关产品推荐
相关产品推荐

