多个RewriteConds和RewriteRule堆叠在一起

时间:2009-12-31 09:39:49

标签: apache mod-rewrite

我有这个apache重写规则:

  RewriteEngine on
  RewriteBase /
  RewriteCond %{HTTP_HOST} mycompany.com
  RewriteRule ^$  http://mycompany.com/login   [L]
  # we check if the .html version is here (caching)
   RewriteRule ^$ index.html [QSA]
   RewriteRule ^([^.]+)$ $1.html [QSA]
   RewriteCond %{REQUEST_FILENAME} !-f

   # no, so we redirect to our front web controller
   RewriteRule ^(.*)$ index.php [QSA,L]

我唯一能理解的是,如果它是mycompany.com,那么脚本将重定向到http://mycompany.com/login。如果没有,那么......

我无法理解。

知道上面的剧本说的是什么?

1 个答案:

答案 0 :(得分:1)

有趣的东西,不容易理解。 谷歌搜索代码中的评论文本给出了有趣的结果:http://www.google.com/search?q=%22%23+we+check+if+the+.html+version+is+here+%28caching%29%22

编辑:如果我们查看最后几行并知道Symfony使用缓存(它在URL显示的同一目录中创建扩展名为.html的本地文件),我可以尝试解释这里的行

如果请求的网址类似于http://yoursite.com/blabla/,我们会尝试在该目录中打开index.html文件。如果文件不存在,则会发生另一个重写循环,最后一个Cond将被命中(文件不存在)

RewriteRule ^$ index.html [QSA]

如果网址中有更多内容,例如http://yoursite.com/blabla/blblbl,请尝试查找文件blblbl.html

RewriteRule ^([^.]+)$ $1.html [QSA]

这是所有网址的收集器,它们与之前的任何规则都不匹配,或者缓存的文件不存在:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]