【问题标题】:Using multiple rewrite rules?使用多个重写规则?
【发布时间】:2012-08-22 18:26:02
【问题描述】:

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


    【解决方案1】:

    您应该首先知道重写条件只影响以下重写规则,并且您在重写条件和重写规则之间添加了新规则,这意味着它们现在只会影响您的新规则而不是旧规则(什么您的代码中只有当目标 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>
    

    【讨论】:

      【解决方案2】:

      您必须添加[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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-15
        • 2017-11-21
        • 2013-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多