2011-09-18 312 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]