2009-11-02 89 views
0

我正在研究設置一個應用程序,其中有一個核心和一個項目命名空間,其中核心是項目自定義的默認回退。爲此ID希望能夠級聯各種資源,如CSS,Javascript代碼等的練習吧的目的,我已經簡化了這個作爲使用mod_rewrite級聯資源選擇

./.htaccess 
./first/firstonly.txt 
./first/both.txt 
./second/secondonly.txt 
./second/both.txt 

預期的行爲將是一個請求將在第一尋找之前檢查是否存在在第二和最後投擲404

爲baseURL時/ firstonly.txt會打./first/firstonly.txt(200),
而baseURL時/ secondonly.txt會嘗試./first/secondonly.txt(404 )然後./second/secondonly.txt(200)。
baseurl/both.txt會打到./first/both.txt(200)並且不再繼續。
baseurl/nonexistant.txt(404)將貫穿級聯並返回404.

我相當mod_rewrite competant,所以不覺得有必要在這裏談論基礎知識。什麼是最有效的(理智的)實現方式?拋開速度的擔憂,因爲大部分時間都會在第一次擊中時發現。

回答

0
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f 
RewriteRule ^Public/(.*)$ Application/Public/$1 [L] 

RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule .* - [L] 

RewriteRule ^(css|scripts|images|assets|flash)/(.*)$ Public/$1/$2 [L] 

這是最終的工作解決方案(上面的沙箱示例以外)。

0

嘗試下列規則:

RewriteEngine on 
RewriteRule ^(first|second)/ - [L] 
RewriteCond %{DOCUMENT_ROOT}/first/$0 -f 
RewriteRule ^[^/]+$ first/$0 [L] 
RewriteCond %{DOCUMENT_ROOT}/second/$0 -f 
RewriteRule ^[^/]+$ second/$0 [L] 
+0

啊,是的,這很類似於我自己提出的解決方案,但是它依賴於項目根目錄在文檔根目錄中,這並不總是會發生。它需要能夠相對於.htaccess愉快地工作(這是當前的難點) – jhogendorn

+0

@devians:改爲嘗試使用'RewriteCond first/$ 0 -F'。 – Gumbo

+0

做rewritecond這樣的檢查似乎不工作,它需要完整的路徑 – jhogendorn

0

其他一些可能的解決方案

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^first 
RewriteCond %{REQUEST_URI} !^second 
RewriteRule ^([^/]+\.?[^/])*$ first/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^second 
RewriteRule ^first/([^/]+\.?[^/])*$ second/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^(first|second).*$ 
RewriteRule .* /404.html [L] 

RewriteCond %{REQUEST_URI} 404.html 
RewriteRule .* - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^first 
RewriteCond %{REQUEST_URI} !^second 
RewriteRule ^([^/]+\.?[^/])*$ first/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^second 
RewriteRule ^first/([^/]+\.?[^/])*$ second/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^(first|second).*$ 
RewriteRule .* /404.html [L] 

在我個人的測試IM注意到了-f檢查只精確反對完整的路徑名,如果你不在文檔根目錄下,這會讓事情變得棘手。這可以通過重寫到文件,然後在request_uri上執行-f來解決嗎?