我有一个简单的 .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>
您必须添加
[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。 |
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 -到-作为
您应该首先知道重写条件仅影响以下重写规则,并且您在重写条件和重写规则之间添加了新规则,这意味着它们现在只会影响您的新规则,而不影响旧规则(您拥有的规则)在您的代码中,重写规则仅在目标 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>