15

我有一个简单的 .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>
4

2 回答 2

51

您必须添加[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 处理。透明地提供来自其他服务器的内容,因为您的网络服务器会获取并重新提供它。这是一个危险的标志,因为一个写得不好的标志会把你的网络服务器变成一个开放代理,这很糟糕。
  • PT = 通过。考虑 RewriteRule 匹配中的 Alias 语句。
  • QSA = QSAppend。当原始字符串包含查询 ( http://example.com/thing?asp=foo ) 时,将原始查询字符串附加到重写的字符串。通常它会被丢弃。对动态内容很重要。
  • R = 重定向。提供到指定 URL 的 HTTP 重定向。还可以提供准确的重定向代码 [R=303]。与 RedirectMatch 非常相似,后者更快,应尽可能使用。
  • S = 跳过。跳过这条规则。
  • T = 类型。指定返回内容的 MIME 类型。非常类似于 AddType 指令。

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

于 2012-08-28T09:07:43.310 回答
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>
于 2012-08-28T09:17:15.757 回答