2009-02-27 57 views
14

我希望有一種方法可以用mod_rewrite和Apache來做到這一點,但也許還有另一種方法可以考慮。僅當文件未找到時才重定向請求?

在我的網站上,我爲客戶設置了用於網站重新版本的目錄。如果Web根目錄是/home/blah/www,則客戶端目錄將是/home/blah/www/clients/abc。當您通過Web瀏覽器訪問客戶端目錄時,如果它們存在,我希望它使用客戶端目錄中的任何請求的文件。否則,我希望它使用Web根目錄中的文件。

例如,假設客戶不需要他們自己的index.html。因此,有些代碼會確定/home/blah/www/clients/abc中沒有index.html,而是使用/home/blah/www中的那個。請記住,我不想隨時將客戶端重定向到Web根目錄,如果客戶端目錄沒有指定它自己的副本,我只想使用具有該名稱的Web根目錄文件。網絡瀏覽器應該仍然指向/clients/abc該文件是否存在那裏或者在根目錄中。同樣,如果在客戶端目錄中有news.html的請求,並且確實存在,則只需提供該文件而不是Web根目錄news.html即可。用戶的體驗應該是無縫的。

我需要這個來處理任何文件名上的請求。例如,如果我需要爲每個可能需要重定向的文件添加一個新行,則.htaccess會違反目的,因爲需要進行過多的維護,並且在出現大量文件的情況下出現錯誤的可能性很大。

在您的示例中,請指明您的代碼是否位於客戶端目錄中的.htaccess文件或Web根目錄中。 Web根目錄是首選。

回答

4

我似乎至少有一個問題與每個例子a波夫。 %{DOCUMENT_ROOT}似乎在某些地方做錯了事,有些/字符似乎不見了。這是我的解決方案,它位於web根目錄中的.htaccess

而不是使用兩個規則(一個用於找到客戶端/下的文件,另一個找不到),我需要檢查的是所請求的文件(或目錄)是否不存在。因爲如果它存在,不需要改變,它可以使用客戶端目錄中提供的文件。這裏是我解決的代碼:

RewriteEngine on 
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-f 
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-d 
RewriteRule ^clients/([^/]+)/(.*)$ $2 [L] 

感謝您的幫助!

3
RewriteCond %{REQUEST_FILENAME} !-f 
+1

似乎太短,做我想做的。你能解釋一下這個邏輯嗎?謝謝! – DivideByHero 2009-02-27 15:18:15

23
# If requested resource exists as a file or directory, skip next two rules 
RewriteCond %{DOCUMENT_ROOT}/$1 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/$1 -d 
RewriteRule (.*) - [S=2] 
# 
# Requested resource does not exist, do rewrite if it exists in /archive 
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -d 
RewriteRule (.*) /archive/$1 [L] 
# 
# Else rewrite requests for non-existent resources to /index.php 
RewriteRule (.*) /index.php?q=$1 [L] 

Rewrite if files do not exist

0

試試這個:

RewriteEngine on 
RewriteRule ^clients/abc/ - [L] 
RewriteCond %{DOCUMENT_ROOT}clients/abc/$0 -f 
RewriteRule .* clients/abc/$0 [L] 
+0

這是爲Web根目錄中的.htaccess設計的嗎? – DivideByHero 2009-02-27 15:18:54

+0

是的,它用於文檔根目錄中的.htaccess文件。 – Gumbo 2009-02-27 15:44:53

0

我想你想沿着這些路線的東西:

RewriteEngine on 
RewriteCond %{DOCUMENT_ROOT}clients/$1/$2 -f 
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}clients/$1/$2 [L] 
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}$2 [L] 
9

這個怎麼樣?

# If requested resource exists as a file or directory go to it 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule (.*) - [L] 

# Else rewrite requests for non-existent resources to /index.php 
RewriteRule (.*) /index.php?q=$1 [L]