使用多个重写规则?

时间:2012-08-28 09:05:26

标签: apache .htaccess mod-rewrite

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

2 个答案:

答案 0 :(得分:35)

您必须添加[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 = Chain。继续处理下一个RewriteRule。如果此规则不匹配,则不会执行下一个规则。稍后会详细介绍。
  • E =设置环境变量。 Apache有各种可能影响Web服务器行为的环境变量。
  • F =禁止。如果此规则匹配,则返回403-Forbidden错误。
  • G =走了。如果此规则匹配,则返回410-Gone错误。
  • H =处理程序。强制将请求处理为就像指定的MIME类型一样。
  • N =下一个。强制规则重新开始并重新匹配。小心!可以导致循环。
  • NC =没有案例。允许[jpg]匹配jpg和JPG。
  • NE =没有逃脱。防止将特殊字符(。?#&amp; etc)重写为其十六进制代码。
  • NS =无子请求。如果您使用的是服务器端包含,则会阻止与包含文件的匹配。
  • P =代理。强制规则由mod_proxy处理。透明地提供来自其他服务器的内容,因为您的Web服务器获取并重新提供服务。这是一个危险的标志,因为写得不好的人会把你的网络服务器变成一个开放的代理服务器,那就不好了。
  • 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

答案 1 :(得分:6)

首先你应该知道重写条件只影响下面的重写规则,你在重写条件和重写规则之间添加了新规则,现在它们只影响你的新规则而不是旧规则(什么你有代码的是,只有当目标网址不是文件或目录时才会执行重写规则),所以如果你希望旧规则仍然受重写条件的影响,你必须添加新规则在重写条件之前。

对于你的问题,我认为samsamX已经回答足够了(通过添加[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>