例如:
uat
应该打开
prod
但是网址不会改变。
答案 0 :(得分:2)
试试这个:
RewriteEngine On
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)\?id=(.+)\sHTTP.*$
RewriteRule ^(.*)$ /route.php?action=$1&id=%2 [QSD,R=301,L,NE]
RewriteCond %{QUERY_STRING} ^action=(.*)&id=(.*)$
RewriteRule ^ /%1?id=%2 [QSD,L,NE]
首先,我匹配包含查询字符串id=whatever
的请求,然后使用新的查询字符串重定向它。
然后我匹配包含新查询字符串action=whatever&id=whatever
的新URI,并将其内部重定向到相同的原始路径。
QSD 标志在Apache 2.4.0及更高版本https://httpd.apache.org/docs/trunk/rewrite/flags.html中可用,我添加了以丢弃以前的查询字符串并阻止其附加。
清除浏览器缓存然后测试这些规则。
<强>更新强>
根据您的评论,您希望在浏览器内部/route.php?action=read&id=1
内部打开/read?id=1
,这样您就可以执行starkeen所回答的问题,但是使用特定的查询字符串和常规URI,它应该如下所示:
RewriteEngine on
RewriteCond %{QUERY_STRING} ^id=(.*)$
RewriteRule ^(.*)$ /route.php?action=$1 [QSA,L]
因此,如果查询字符串已存在且策略为id=whatever
,则/abc?id=123
将从/route.php?action=abc&id=123
内部获取,而之前的查询字符串将附加新的
答案 1 :(得分:0)
您可以在RewriteRule
中使用以下/.htaccess
:
RewriteEngine on
RewriteRule ^read/?$ /route.php?action=root [QSA,L]
这会将/read?id=1
重写为/route.php?action=read&id=1
。您不会在规则的目标中读取&id=1
,因为QSA会自动将其添加到重写目标。