如何通过"?"用htaccess拆分URL?

时间:2018-03-21 16:50:14

标签: .htaccess url mod-rewrite

例如:

uat

应该打开

prod

但是网址不会改变。

2 个答案:

答案 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会自动将其添加到重写目标。