htaccess中的mod_rewrite:阻止循环的最佳方法?

时间:2012-10-22 09:48:48

标签: regex apache mod-rewrite

我的htdocs / MVC /文件夹中有一个.htaccess文件,看起来像这样

RewriteEngine On

# if its already been rewritten to the specific folder
RewriteCond %{REQUEST_URI} ^/MVC/public/img/(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^/MVC/public/index.php$
# skip next two rules
RewriteRule .? - [S=2]

# rewrite image requests
RewriteRule (.*\.(jpg|png|gif))$ public/img/$1 [L]
# rewrite all other requests to the front controller index.php
RewriteRule (.*) public/index.php?url=$1 [QSA,L]

我想要实现的是所有图像请求都转到文件夹MVC / public / img所有其他请求转到文件夹MVC / public中的前端控制器index.php。这是设置这些规则并阻止mod_rewrite循环的最佳方法吗?

1 个答案:

答案 0 :(得分:4)

使用S标记跳过很好,但缺点是:

  1. 有点难以阅读(如果其他人正在看它)
  2. 如果您需要附加新规则,则需要检查其跳过的方式
  3. 如果您的规则变得越来越复杂,维护正确的跳过越来越困难
  4. 阻止循环的其他可能方法:

    RewriteCond %{ENV:REDIRECT_STATUS} 200
    RewriteRule ^ - [L]
    

    如果在前一个循环中应用了规则(或者应用了mod_alias重定向),则将此放在规则的最顶层将立即停止重写。

    所以它看起来像这样:

    RewriteCond %{ENV:REDIRECT_STATUS} 200
    RewriteRule ^ - [L]
    
    # rewrite image requests
    RewriteRule (.*\.(jpg|png|gif))$ public/img/$1 [L]
    # rewrite all other requests to the front controller index.php
    RewriteRule (.*) public/index.php?url=$1 [QSA,L]
    

    优点:你永远不必担心循环,因为第二次立即以ENV检查结束 缺点:如果您碰巧需要创建循环规则,此方法将阻止它继续工作