
伺服器:Debian Jessie Apache:2.4.9-1 PHP:5.5
我想要的是將所有非文件和非目錄重定向到我自己處理它們的index.php。由於我的專案的性質,我必須在虛擬主機內工作。
我在我正在開發的 Web 專案中使用虛擬主機 (vHosts) 和 mod_rewrite。這是虛擬主機檔案...
<VirtualHost *:80>
ServerName foo.com
ServerAlias www.foo.com
ServerAdmin [email protected]
DocumentRoot /srv/foo/main/www/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [L]
</IfModule>
</VirtualHost>
vHost 按預期工作,重寫規則按預期將請求重定向到 index.php。但是,當我嘗試存取伺服器上的檔案時,例如:
foo.com/css/style.css
位於:
/srv/foo/main/www/css/style.css
我的請求被重定向到index.php
這很奇怪,因為重寫條件語句應該可以解決這個問題。
所有資料夾權限設定為 755,所有檔案權限設定為 644。
我已經能夠毫無疑問地確認重寫條件在不應該匹配的情況下是匹配的。我可以透過查看 apache 的錯誤日誌並啟用 mod_rewrite 的偵錯輸出來看到這一點。
為什麼兩個 RewriteCond 語句不正確符合?
他們可能沒有看到 vHost DocumentRoot 嗎?
更新:關閉重寫引擎可以讓我存取正在測試的檔案。 IE,我的 URI 是對的。我知道我的路很好,只是因為某些原因條件不佳。
答案1
對於任何在虛擬主機上使用 Apache 2.4 並希望在上述 vHost 內使用 mod_rewrite 並具有重寫條件並需要檢查 vHost 內的文件或資料夾的人,這是如何執行重寫條件的...
<VirtualHost *:80>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.*)$ /index.php [L]
</IfModule>
</VirtualHost>
我想出了這個,看起來效果很好。
說明...
%{CONTEXT_DOCUMENT_ROOT}%{REQUEST_URI}
將為您提供上下文相關的文檔根目錄。 IE,套用虛擬主機後的文檔根目錄。但它不會為您提供 URI,因此我們需要添加 來%{REQUEST_URI}
完成工作。
CONTEXT_DOC_ROOT == /srv/foo/main/www
REQUEST_URI == /css/style.css
CONTEXT_DOC_ROOT + REQUEST_URI == /srv/foo/main/www/css/style.css
剩下的就很容易了。很棒的醬。希望這可以幫助!