2011-09-18 75 views
1

我试图重写对存在的文件的请求,无论其扩展名,在该目录的公共目录中,以及其他所有内容到控制器。如果用户转到http://example.com/images/foo.gif,并且该图像存在,则应从%{DOCUMENT_ROOT} /public/images/foo.gif中提供图像。如果他们去http://example.com/foo/bar,并且它不存在,那么请求应该通过index.php路由。到目前为止,我所拥有的两个区块是分开工作的,但不能组合在一起。当两者都放在.htaccess中时,无论哪一个首先在.htaccess中完美工作,并且底部的一个完全被忽略(当我尝试测试时,它会给出一个404页面)。有人可以向我解释我做错了什么吗?mod_rewrite问题

RewriteCond %{DOCUMENT_ROOT}/public/%{REQUEST_URI} -f 
RewriteRule ^.*$ - [L] 
RewriteRule ^.*$ index.php [L] 

RewriteCond %{DOCUMENT_ROOT}/public/%{REQUEST_URI} !-f 
RewriteRule ^.*$ - [L] 
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/public/$1 [L] 

回答

0

看起来好像有一些错误。

它看起来像你的RewriteCond的倒退。如果%{DOCUMENT_ROOT}/public/%{REQUEST_URI}没有存在(!-f),那么你想重写index.php,但是如果它确实存在(-f),那么重写为/ public/$ 1。第二件事RewriteRule ^.*$ - [L]实际上是阻止应用实际规则,因为它以[L]结束,并且停止当前迭代中的重写。

即使你删除^.*$ - [L]重写和翻转-f!-f,运行与重写的第二个迭代一个问题:

RewriteCond %{DOCUMENT_ROOT}/public/%{REQUEST_URI} !-f 
RewriteRule ^.*$ index.php [L] 

RewriteCond %{DOCUMENT_ROOT}/public/%{REQUEST_URI} -f 
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/public/$1 [L] 

这是发生了什么,当您尝试访问http://example.com/foo/bar

  1. %{DOCUMENT_ROOT} /公共//富/酒吧不存在,!-f条件满足
  2. 富/栏改写成的index.php,与[L],端读和写伊特
  3. 该请求被重定向INTERNALLY到index.php
  4. 随着新的URI(的index.php)所有规则重新应用
  5. %{DOCUMENT_ROOT} /public/index.php存在,!-f条件失败
  6. %{DOCUMENT_ROOT} /public/index.php存在,-f条件满足
  7. index.php文件被改写为%{DOCUMENT_ROOT} /public/index.php
  8. 内部重定向,并且所有规则都将重新应用到新的URI(/public/index.php)
  9. %{DOCUMENT_ROOT} /public//public/index.php do esn't存在,!-f条件满足
  10. 公共/ index.php文件被改写到index.php
  11. 回去3.内部循环,当您尝试访问http://example.com/images/foo.gif

同样的事情也发生了,基本上,你需要得到另一个规则来停止第二次重写。所以你需要添加第二组条件:

RewriteCond %{REQUEST_URI} !^/public/ 
RewriteCond %{DOCUMENT_ROOT}/public/%{REQUEST_URI} !-f 
RewriteRule ^.*$ index.php [L] 

RewriteCond %{REQUEST_URI} !/index.php 
RewriteCond %{DOCUMENT_ROOT}/public/%{REQUEST_URI} -f 
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/public/$1 [L]