更换?根据 RewriteRule 的请求

问题描述 投票:0回答:2

site.com/link?p=2

给 $_GET['p']==2 即使我已经做了

site.com/link

重写为

site.com/index.php?page=link

所以,我正在尝试替换 site.com/link?p=2 与 site.com/link&p=2

RewriteEngine on

RewriteRule (.*)\?(.*) $1\&$2

RewriteCond %{REQUEST_URI} !\....$
RewriteRule ^(.*)$ /index.php?p=$1

这不起作用!

mod-rewrite
2个回答
3
投票

RewriteRule
无法看到左侧的查询字符串(
?
及其后面的任何内容);它仅匹配 URL 的路径部分。

但好消息是,您可能需要做的就是:

RewriteEngine on

RewriteCond %{REQUEST_URI} !\....$
RewriteRule ^(.*)$ /index.php?p=$1 [QSA]

QSA
选项“查询字符串添加”告诉您的RewriteRule添加到查询字符串而不是替换它(默认行为,这无疑引发了整个问题)。


0
投票

在某些情况下,您需要在同一个正则表达式中同时使用 URI 和查询字符串。我正在为这种情况提供答案,因为此请求也被 Google 重定向到此处。

这种情况的一个例子是检查正则表达式断言中是否存在 URL 部分或参数。对于这种情况,请使用

%{THE_REQUEST}
参数,而不是
%{REQUEST_URI}
。这是在这样的示例中的样子(类似于我在现实生活场景中的情况):

RewriteCond %{THE_REQUEST} "/account(?!/password|/\?action=reset_pwd).*" [NC]
RewriteRule .? /profile [R,L]
© www.soinside.com 2019 - 2024. All rights reserved.