我的页面中有两种类型的网址。
1- http://www.example.com/index.php?id=12
我一直想要这个:
但对于其他任何事情:
2- http://www.example.com/index.php?id=12&id2=123&asd=qwe&svd=sdf ...
我希望它没有变化:
http://www.example.com/?id=12&id2=123&asd=qwe&svd=sdf ...
所以我只想重定向http://www.example.com/index.php?id=12
我试试这个
RewriteCond %{THE_REQUEST} ^GET\ /(.*/)?(?:index\.php)?\?id=([^\s&]+) [NC]
RewriteRule ^ /%1%2? [R=301,L]
仅适用于第一个(http://www.example.com/index.php?id=12)
但是第二次,它会重定向到(http://www.example.com/ ***)
我在stackoveflow中读到我必须使用[QSA,L]
所以我试试这个:
RewriteCond %{THE_REQUEST} ^GET\ /(.*/)?(?:index\.php)?\?id=([^\s&]+) [NC]
RewriteRule ^ /%1%2? [QSA,L]
但我收到500错误(内部服务器错误)
这是我的完整代码:
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{THE_REQUEST} ^GET\ /(.*/)?(?:index\.php)?\?id=([^\s&]+) [NC]
RewriteRule ^ /%1%2? [R=301,L]
---编辑---
我可以用这个
来做RewriteRule ^index.php/([^/]+)/?([^/]*) /index.php?id=$1 [NC]
例如www.example.com/123有效!
但www.example.com/index.php?id=123未重定向到www.example.com/12
答案 0 :(得分:1)
要将http://example.com/index.php?id=foo
转换为http://example.com/foo
,您可以在root/.htaccesso
中使用以下规则:
RewriteEngine on
#1)Redirect "/index.php?id=foo" to "/foo"#
RewriteCond %{THE_REQUEST} /(?:index\.php)?\?id=([^\s&]+)\sHTTP [NC]
RewriteRule ^ /%1? [L,R]
#2)The rule bellow will internally map "/foo" to "/index.php?id=foo"#
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ /index.php?id=$1 [L]
[已测试]这适用于我的apache服务器。