2

我的 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 循环的最佳方法吗?

4

1 回答 1

5

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

  1. 阅读起来有点困难(如果其他人在看)
  2. 如果您需要附加新规则,则需要检查它的跳过方式
  3. 如果您的规则变得越来越复杂,那么保持正确的跳过将变得越来越困难

防止循环的其他可能方法:

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 检查结束 缺点:如果您碰巧需要创建循环规则,此方法将阻止它工作

于 2012-10-22T10:45:00.267 回答