通过mod-rewrite

时间:2016-04-26 07:58:57

标签: .htaccess url mod-rewrite url-rewriting url-redirection

我的页面中有两种类型的网址。

1- http://www.example.com/index.php?id=12

我一直想要这个:

http://www.example.com/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

1 个答案:

答案 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服务器。