通过url重写在htaccess中有选择地从url获取查询字符串的一部分

时间:2014-07-23 23:50:19

标签: regex apache .htaccess mod-rewrite url-rewriting

我在.htaccess文件中有这个:

RewriteEngine On
RewriteCond %{THE_REQUEST} /index\.php\?p=(?!admin)(?!superadmin)((?![^&]*?edit)[^\s&]+) [NC]
RewriteCond %{THE_REQUEST} /index\.php\?p=([^\s&]+) [NC]
RewriteRule ^ /%1? [R=301,L,QSA]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ index.php?p=$1 [L,QSA]

这会重写两个方向。一种方式:

domain.com/index.php?p=Home&l=en&m=0

为:

domain.com/Home

反之亦然。我想要做的是保留在'p'值之后的URL的查询字符串部分,并将其传递给BOTH WAYS。

我能用这种代码做一种方式:

RewriteEngine On
RewriteCond %{THE_REQUEST} /index\.php\?p=(?!admin)(?!superadmin)((?![^&]*?edit)[^\s&]+) [NC]
RewriteCond %{THE_REQUEST} /index\.php\?p=([^\s&]+)&p=([^\s&]+) [NC]
RewriteRule ^ /%1?%2? [R=301,L,QSA]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ index.php?p=$1 [L,QSA]

但我无法正确对待。你们能帮忙吗?我基本上希望p的值作为域之后的URL的一部分写入,我不希望它再次出现,但我希望附加所有其他变量。

现在我得到的是:

domain.com/Home?m=0?&p=Home&ms=m0&l=en

1 个答案:

答案 0 :(得分:1)

这应该适合你:

RewriteEngine On

RewriteCond %{THE_REQUEST} /index\.php\?p=((?!(?:admin|superadmin|[^&]*?edit))[^\s&]+)(?:&(\S+))? [NC]
RewriteRule ^ /%1?%2 [R=302,L,NE]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ index.php?p=$1 [L,QSA]