2013-05-04 52 views
1

我在我的網站的根一般的重寫規則看起來像這樣:htaccess的重寫,但不包括子目錄

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([\w]+)/?([\w]+)? index.php?action=$1 

工作正常進行重寫URL像「www.example.com/myAction 「到」www.example.com/index.php?action=myAction「

這必須保持這樣,但我需要排除子目錄(」/登錄「)從重寫。

所以,我想:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^/login/ 
RewriteRule ^([\w]+)/?([\w]+)? index.php?action=$1 

但仍沒有運氣。我已經閱讀了幾個關於SO的答案,但找不到這個缺陷。有任何想法嗎?謝謝!

回答

5

您已經一個額外的斜槓。與Virtual Host不同,.htaccess不使用前面的斜槓。另外/login/是一個目錄。所以你可以匹配任何不是真正的文件,但可能是一個真正的目錄。因此,如果例如'/ css /'存在,您可以根據請求將其重寫爲index.php。

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^login/ 
RewriteRule ^([^/]+) index.php?action=$1 

如果它還是意外作用可能需要確保你不會重寫現有的目錄和嘗試這個辦法:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !^login/ 
RewriteRule ^([^/]+) index.php?action=$1 

我也注意到,你只捕捉到第一個斜槓(可能),因爲您使用的是?查找,所以在我之前的佈局中,我顯示的代碼稍短一些。捕獲整個URI你這樣做:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !^login/ 
RewriteRule ^(.*) index.php?action=$1 

要捕獲第二(和第三)的字符串,你可以做這樣的事情:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !^login/ 
RewriteRule ^([^/]+)/([^/]+)/([^/]+) index.php?action=$1&page=$2&response=$3 
0

你有什麼應該工作,但你可以或者嘗試對/login/所有請求通過,而不是被傳遞:

RewriteEngine On 

RewriteRule ^login/? - [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([\w]+)/?([\w]+)? index.php?action=$1