2011-11-18 62 views
0

我有我所有的重寫規則設置和在.htaccess中工作,但我需要將所有不匹配的規則重定向到一個共同的地方。mod_rewrite將所有不匹配的規則重定向到一個公共文件

下面是規則:

# add trailing slash  
RewriteCond %{DOCUMENT_ROOT} -d 
RewriteRule ^([^.]*[^/])$ $1/ [R] 

# redirect directories to old site if it exists  
RewriteCond %{DOCUMENT_ROOT}/old_site/$0 -d 
RewriteRule ^(.*) old_site/$1 [NC,QSA,L] 

#redirect files to old site if they exist 
RewriteCond %{DOCUMENT_ROOT}/old_site/$0 -f 
RewriteRule ^(.*) old_site/$1 [NC,QSA,L] 

這個偉大的工程,而是試圖重定向流量的其餘部分(全部無與倫比的規則),剛剛超過的index.php寫入上述所有的規則:

RewriteCond %{REQUEST_FILENAME} -d 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . index.php 

如何確保這部分只有在沒有其他任何東西(我猜除了尾部斜線部分)匹配的情況下才能執行?

編輯:@喬恩每林 正如我已經改變了過去的三線

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule . index.php 

現在適用於一切,但不以斜線結束目錄。我不能將[L]放在第一條規則上,因爲我需要將它重新寫入其他目錄。

回答

1

該規則永遠不會被應用,因爲%{REQUEST_FILENAME}永遠不會同時是目錄而不是目錄。如果你想現有的目錄和文件不會被改寫(比如,如果你鏈接到的圖像),則包括這些條件:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 

你的規則是罰款。但您可能想在其末尾包含[L]

此外,你有第一個規則,你檢查文檔根是否是一個目錄(它應該),這意味着該規則將始終應用,這意味着/index.php將被重寫爲/index.php/。我認爲您可能正在尋找%{REQUEST_FILENAME}而不是%{DOCUMENT_ROOT}。

+0

謝謝我已經添加了規則,但它不適用於不以斜線結尾的目錄,第一條規則將斜線添加到沒有點和斜線的內容中,所以它贏得了'將index.php重寫爲index.php /我已經更改爲REQUEST_FILENAME,但它沒有區別。 – keeg

+0

您是否嘗試過使用'DirectorySlash on'? –

+0

畢竟你是對的,因爲我是重定向的,我需要在最後的L現在它工作完美! – keeg

相關問題