使用多个重写规则?

use*_*244 11 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>
Run Code Online (Sandbox Code Playgroud)

我想添加这条规则.

RewriteRule ^p$ index.php?p= 
Run Code Online (Sandbox Code Playgroud)

我尝试在下面这样做,但它不起作用.似乎两条规则都在运行.我尝试了几个不同的旗帜,再次没有运气.有人可以告诉我如何使这个工作.

<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>
Run Code Online (Sandbox Code Playgroud)

zes*_*ssx 39

您必须添加[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>
Run Code Online (Sandbox Code Playgroud)

提醒RewriteRule标志:

  • L =最后.一旦匹配,就停止处理RewriteRules.订单数量!
  • C =链.继续处理下一个RewriteRule.如果此规则不匹配,则不会执行下一个规则.稍后会详细介绍.
  • E =设置环境变量.Apache有各种可能影响Web服务器行为的环境变量.
  • F =禁止.如果此规则匹配,则返回403-Forbidden错误.
  • G =走了.如果此规则匹配,则返回410-Gone错误.
  • H =处理程序.强制处理请​​求,就好像它是指定的MIME类型一样.
  • N =下一步.强制规则重新开始并重新匹配.小心!循环可能会导致.
  • NC =没有案例.允许[jpg]匹配jpg和JPG.
  • NE =没有逃脱.防止将特殊字符(.?#&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


Ous*_*ama 8

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

对于你的问题,我认为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>
Run Code Online (Sandbox Code Playgroud)