2012-12-10 277 views
1

我想在Ubuntu 12.04服務器上使用mod_rewrite使我的URL更具可讀性,但是我想爲圖像和css文件添加例外。RewriteCond被忽略?

我輸入的網址格式爲\controller\action,然後重寫爲index.php?controller=controller&action=action。我想添加一個異常,以便如果指定了圖像或css文件,則URL不會被重寫,例如, \images\image.jpg不會被重寫。

我的.htaccess代碼如下:

RewriteEngine on 
RewriteCond %{REQUEST_URI} !(\.gif|\.jpg|\.png|\.css)$ [NC] 
RewriteRule ^([a-zA-z]+)/([a-zA-z]+)$ test.php?controller=$1&action=$2 [L] 
RewriteRule ^([a-zA-z]+)/([a-zA-z]+)/([^/]*)$ test.php?controller=$1&action=$2&$3 [L] 

我重新寫代碼工作正常,並且URL是走出來的打算,但即使我要求的圖像時,URL還是被重新-書面。看來,我的RewriteCond被忽略了,任何人有任何建議,爲什麼這可能是?

回答

0

rewriteCond規則僅適用於下一個RewriteRule。

所以你需要至少重複rewriteCond爲你的第二次重寫規則。

不,當然有更好的事情要做。 例如,通常的做法是測試url是否與真正的靜態資源相匹配。如果你所有的PHP代碼是web目錄以外(在圖書館目錄中,除了index.php文件),然後可直接在文檔根的所有styatic ressources只能是JS文件,CSS文件或圖像文件。

因此,這是做它的通常方式:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([a-zA-z]+)/([a-zA-z]+)$ test.php?controller=$1&action=$2 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([a-zA-z]+)/([a-zA-z]+)/([^/]*)$ test.php?controller=$1&action=$2&$3 [L] 

但是,這是一個起點。我們當然可以找到的東西,以避免做2條規則這(也許我會看看以後)

0

的的RewriteCond只適用於你的第一個重寫規則,應再現了第二條規則。不過,我認爲最好在之前添加一個非重寫規則,以排除現有的東西。

# Do nothing for files which physically exist 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule .* - [L] 

# your MVC rules 
RewriteRule ^([a-zA-z]+)/([a-zA-z]+)$ test.php?controller=$1&action=$2 [L] 
RewriteRule ^([a-zA-z]+)/([a-zA-z]+)/([^/]*)$ test.php?controller=$1&action=$2&$3 [L]