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

Regex 通过在htaccess中重写url,有选择地从url获取查询字符串的一部分,regex,apache,.htaccess,mod-rewrite,url-rewriting,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 %{RE

我的.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
致:

反之亦然。我想做的是保留URL中“p”值后面的查询字符串部分,并将其双向传递

我可以用一种方法,使用以下代码:

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

这应该适合您:

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]

domain.com/Home?m=0?&p=Home&ms=m0&l=en
?@anubhava的漂亮URL是什么。丑陋的url应该是domain.com/index.php?p=Home&ms=m0&l=en,但我正在尝试将漂亮的url设置为domain.com/Home?ms=m0&l=enthanks,以满足您的建议,但这会产生相同的结果,即“p”的值被使用两次,首先作为漂亮url的替换值,然后作为不正确的查询字符串。这会将
/index.php?p=Home&ms=m0&l=e
重定向到您编写的
/Home?ms=m0&l=e
。您的浏览器很可能已缓存结果。在新浏览器中测试或清除缓存。你是对的,我应该向你道歉。我被纠正了。当我清除所有的缓存时,我看到了我希望看到的行为。非常感谢。我还有最后一个问题。。。重定向中断(404)当我有一个带斜杠的p时(比如:p=Folder/File)-“p”domain.com/index.php的值有斜杠时?p=Folder/File&ms=0重写为domain.com/Folder/File?ms=0(这是正确的),但是我得到了一个404错误,即使没有找到htaccess文件,我也会非常感谢您的帮助!感谢将最后一条规则更改为:
RewriteRule^(+?)/?$index.php?p=$1[L,QSA]
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]