2012-07-13 31 views
1

我需要Apache中的一個規則,該規則將未找到的CSS文件根據其名稱在另一個文件夾中的名稱重定向到另一個位置。就像這樣:當css不存在時Apache重寫條件回退

  • 請求localhost/css/nonexistent.css
  • 響應localhost/css/g/nonexistent.css

如果CSS存在,只是服務於它像正常:

  • 請求localhost/css/existent.css
  • 響應localhost/css/existent.css

我的項目是介紹CakePHP的默認情況下自帶的規則如下:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php/$1 [QSA,L] 

我提到它,因爲任何新的規則,它不應該打破蛋糕的規則。

感謝您的幫助。

編輯:忘記提及的是,css/g/文件是腳本的別名(蛋糕MVC堆棧內),其 enerates新的CSS文件,並呼應它。到目前爲止的答案似乎做重定向罰款,但它不找到css/g/file.css要麼因爲它確實不存在。

+0

應該指出的是(據我所知,RewriteRule),RewriteCond永遠不會到達,並且可以被刪除。這是因爲規則行會匹配任何請求('^(。*)$')並且標記爲[L](最後一條規則,停止處理)。這意味着:1。您可以刪除最後一行(RewriteCond ...)和2.此問題的解決方案屬於* RewriteEngine行和現有的RewriteRule行之間,並且除非您希望請求*不是[L]標誌*通過Cake(看起來像Cake想要他們,這很常見)。 – 2012-07-13 07:27:06

+0

@ctrahey我不好,我爲Cake貼了一套錯誤的規則,我只是用真正的問題編輯了這個問題。感謝您的評論,但是,它清除了一些事情 – luchomolina 2012-07-13 14:04:06

回答

2

可以嘗試首先檢查是否/ CSS /克/ CSS文件存在:

# Make sure it doesn't exist 
RewriteCond %{REQUEST_FILENAME} !-f 
# Make sure this is a request for a css file: 
RewriteCond %{REQUEST_URI} ^/css/(.*)\.css$ 
# See if the /g/ version exists 
RewriteCond %{DOCUMENT_ROOT}/css/g/%1.css -f 
# rewrite if all conditions satisfied 
RewriteRule ^css/(.*)$ /css/g/$1 [L] 

%1在第三條件反向引用在前面RewriteCond匹配的文件名(沒有擴展的CSS) 。


編輯:

如果實際產生該文件的CSS文件,則跳過的/克/版本檢查,只是把它傳遞給控制器​​:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} ^/css/(.*)\.css$ 
RewriteRule ^css/(.*)$ index.php/css/g/$1 [L] 
+0

請注意,使用的框架吞噬了每一個請求(這太常見了)...所以我們的規則必須在之前,*不應該包括[L ]標誌(以符合框架的期望)。 – 2012-07-13 07:23:45

+0

@ jon-lin謝謝,我會嘗試一下,請注意,我粘貼了一套錯誤的蛋糕規則,我的錯誤。我剛剛用正確的問題編輯了這個問題。 – luchomolina 2012-07-13 14:08:27

+0

...並只是添加了一個新的編輯。 – luchomolina 2012-07-13 14:27:34

3

這裏是重寫規則改編自this SO questionthe Apache mod_rewrite docs

要點是:如果請求是以/css/開頭的路徑,請獲取請求文件的文件系統路徑並檢查它是否存在。如果id不存在,請重寫您的更深層目錄的URL。這應該被放在之前您在問題中發佈的規則。

RewriteCond %{REQUEST_URI} ^/css/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^/css/(.*) /css/g/$1 
+0

謝謝,它似乎做重定向,但它無法找到其他文件,因爲(我忘了提及這一點,只是將其添加爲編輯q)css/g/whatever.css是Cake MVC棧中腳本的別名,即它指向'/ profiles/styles/whatever',所以請求由'styles'動作提供'Profiles'控制器。 – luchomolina 2012-07-13 14:27:11

+0

現在正在工作,'RewriteRule ^/css /(.*)/ css/g/$ 1'應該是'RewriteRule^css /(.*)/ css/g/$ 1'再次感謝 – luchomolina 2012-07-13 15:59:59