【问题标题】:mod_rewrite seems to ignore [L] flagmod_rewrite 似乎忽略了 [L] 标志
【发布时间】:2012-09-07 14:22:08
【问题描述】:

我正在尝试在RewriteRule 中使用[L] 标志,但它似乎不起作用。如果您调用该页面,我想这样做:

www.domain.com/admin/

它会将您重定向到:

www.domain.com/backend.php

否则,如果您调用任何其他页面(某些页面除外),它会重定向到:

www.domain.com/index.php

这是我目前所拥有的:

RewriteEngine on

RewriteRule ^admin/(.*) /backend.php/$1 [L]

RewriteCond $1 !^(index\.php|admin|assets|images|uploads|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

如果我只使用第一条规则,它可以工作(但显然不会将其他页面重定向到 index.php)。如果我添加第二条规则,服务器似乎会忽略第一条规则(我认为它被第二条规则“覆盖”了,即使我添加了[L] 标志)

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    L 不是这样工作的。重写引擎将不断循环遍历所有规则,直到进入引擎的 URI 与出来的​​ URI 相同。 L 只是告诉重写引擎在当前循环迭代中停止应用规则。所以说你有:

    RewriteRule ^(.*)$ /foo/$1 [L]
    RewriteRule ^(.*)$ /bar/$1 [L]
    

    在 1 次迭代后,给定 URI /blah,我得到 /foo/blah,因为它在第一条规则之后停止重写(但仍将继续循环)。如果我删除L:

    RewriteRule ^(.*)$ /foo/$1
    RewriteRule ^(.*)$ /bar/$1
    

    在 1 次迭代后,给定 URI /blah,我得到 /bar/foo/blah。两个规则一个接一个地被应用,因为L 没有阻止它。

    您需要在第二条规则中添加一个条件以防止它重写第一条规则,其中任何一个都可以:

    RewriteCond $1 !^(backend\.php|index\.php|admin|assets|images|uploads|robots\.txt)
    RewriteRule ^(.*)$ /index.php/$1 [L]
    

    或:

    RewriteCond %{ENV:REDIRECT_STATUS} !200
    RewriteCond $1 !^(index\.php|admin|assets|images|uploads|robots\.txt)
    RewriteRule ^(.*)$ /index.php/$1 [L]
    

    【讨论】:

    • 是的,我忘了在第二条规则的条件下添加backend.php。谢谢。
    【解决方案2】:

    你的第二条规则很奇怪。我不知道您通过将$1 作为您检查条件的值来尝试做什么。它应该看起来像这样:

    RewriteEngine on
    
    RewriteRule ^admin/(.*) /backend.php/$1 [L]
    
    RewriteCond %{REQUEST_FILENAME} !^(index\.php|admin|assets|images|uploads|robots\.txt|backend\.php)
    RewriteRule ^(.*)$ /index.php/$1 [L]
    

    注意,我还为backend.php 添加了一个直通方式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 2016-09-30
      • 2016-03-16
      • 2014-02-03
      相关资源
      最近更新 更多