使用多个重写规则?

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

我有一个简单的 .htaccess 文件,其中包含以下内容。

<IfModule mod_rewrite.c>
     RewriteEngine on

     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d

     RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>

我想添加这条规则。

RewriteRule ^p$ index.php?p= 

我尝试在下面执行此操作,但它不起作用。看来这两条规则都在运行。我尝试了几个不同的标志,但再次没有运气。有人可以告诉我如何让它工作吗?

<IfModule mod_rewrite.c>
     RewriteEngine on

     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d

     RewriteRule ^p$ index.php?p= 
     RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>
apache .htaccess mod-rewrite
2个回答
54
投票

您必须添加

[L]
标志才能在一场比赛时停止阅读规则:

<IfModule mod_rewrite.c>
     RewriteEngine on

     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d

     RewriteRule ^p$ index.php?p= [L]
     RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>

RewriteRule
标志提醒:

旗帜 姓名 描述
L 最后 一旦匹配,就停止处理 RewriteRules。订单很重要!
C 链条 继续处理下一个RewriteRule。如果这条规则不匹配,则不会执行下一条规则。稍后会详细介绍。
E 设置环境变量 Apache 有各种可能影响 Web 服务器行为的环境变量。
F 禁止 如果此规则匹配,则返回 403-Forbidden 错误。
G 走了 如果此规则匹配,则返回 410-Gone 错误。
H 处理程序 强制处理请求,就像它是指定的 MIME 类型一样。
N 下一个 强制规则重新开始并重新匹配。当心!可能会导致循环。
NC 没有案例 允许
[jpg]
匹配 jpg 和 JPG。
NE 无路可逃 防止将特殊字符(. ? # 等)重写为其等效的十六进制代码。
NS 没有子请求 如果您使用服务器端包含,这将阻止与包含的文件匹配。
P 代理 强制规则由 mod_proxy 处理。透明地提供来自其他服务器的内容,因为您的 Web 服务器会获取它并重新提供它。这是一个危险的标志,因为编写得不好的标志会将您的网络服务器变成开放代理,这很糟糕。
PT 穿越 在 RewriteRule 匹配中考虑 Alias 语句。
QSA QS追加 当原始字符串包含查询(http://example.com/thing?asp=foo)时,将原始查询字符串附加到重写的字符串中。通常情况下它会被丢弃。对于动态内容很重要。
R 重定向 提供到指定 URL 的 HTTP 重定向。还可以提供准确的重定向代码 [R=303]。与 RedirectMatch 非常相似,速度更快,应该尽可能使用。
S 跳过 跳过此规则。
T 类型 指定返回内容的mime-type。与 AddType 指令非常相似。

摘自这篇(非常)完整的帖子:https://serverfault.com/questions/214512/everything-you-ever-wanted-to-know-about-mod-rewrite-rules-but-were-afraid -到-作为


13
投票

您应该首先知道重写条件仅影响以下重写规则,并且您在重写条件和重写规则之间添加了新规则,这意味着它们现在只会影响您的新规则,而不影响旧规则(您拥有的规则)在您的代码中,重写规则仅在目标 url 不是文件或目录时才会执行),因此,如果您希望旧规则仍受重写条件影响,则必须在重写条件。

对于你的问题,我认为 zessx 已经回答了足够的问题(通过添加

[L]
标志来修复)。

最后你应该得到这样的东西:

<IfModule mod_rewrite.c>
     RewriteEngine on

     RewriteRule ^p$ index.php?p= [L]

     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d
     RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>
© www.soinside.com 2019 - 2024. All rights reserved.