看起來好像有一些錯誤。
它看起來像你的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:
- %{DOCUMENT_ROOT} /公共//富/酒吧不存在,!-f條件滿足
- 富/欄改寫成的index.php,與[L],端讀和寫伊特
- 該請求被重定向INTERNALLY到index.php
- 隨着新的URI(的index.php)所有規則重新應用
- %{DOCUMENT_ROOT} /public/index.php存在,!-f條件失敗
- %{DOCUMENT_ROOT} /public/index.php存在,-f條件滿足
- index.php文件被改寫爲%{DOCUMENT_ROOT} /public/index.php
- 內部重定向,並且所有規則都將重新應用到新的URI(/public/index.php)
- %{DOCUMENT_ROOT} /public//public/index.php do esn't存在,!-f條件滿足
- 公共/ index.php文件被改寫到index.php
- 回去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]