使用<base>
- 標籤是一個很好的解決方案,大多數瀏覽器似乎應付自如。除IE之外還有一些問題,就像預料的那樣......顯然你也可以遇到一些其他有趣的問題,see discussion here。
因此,對於這不是一個選項的人來說,我已經研究過替代方案(「硬性方法」)。
通常你存儲的CSS/JS /靜態圖像/其他的東西是這樣的:
index.php
js/
css/
imgs/
和你想要的JavaScript和樣式表等可用,不管有多少斜線有在URL中。如果您的網址是/site/action/user/new
那麼你的瀏覽器將請求
/site/action/user/css/style.css
/site/action/user/css/framework/fonts/icons.ttf
/site/action/user/js/page.js
/site/action/user/js/jquery/jquery.min.js
/site/action/user/js/some/library/with/deep/dir/structure/file.map
因此,這裏有Apache來解決這個問題的一些重寫規則...首先,如果目標磁盤上實際存在的,不重寫:
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^.*$ - [L,QSA]
在換句話說,如果傳請求文件名是一個目錄或IF請求文件名是一個文件,然後不重寫( - ),最後一個規則(L)並傳遞任何GET參數(QSA,查詢字符串追加)。您也可以使用
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^.*$ - [L,QSA]
如果您還需要符號鏈接。接下來,我們希望即使請求呈現錯誤的基本目錄,也能找到javascript和樣式表,如上所示。
RewriteRule ^.*/js/(.*)$ js/$1 [L]
RewriteRule ^.*/css/(.*)$ css/$1 [L]
該模式是非常明顯的,只是用目錄名稱替換'css'。這仍然有一個問題,特別是對於大量的JavaScript和樣式表,庫等大型網站 - 正則表達式是貪婪的。舉例來說,如果你有一個JavaScript目錄是這樣的:
js/some/library/js/script.js
和你的要求去/site/action/user/new
,瀏覽器會要求/site/action/user/new/js/some/library/js/script.js
,其重寫引擎然後將改寫爲
js/script.js
因爲第一個.*
是貪婪的,匹配/site/action/user/new/js/some/library
。切換到非貪婪的正則表達式並沒有什麼意義,因爲"the rewrite engine repeats all the rules until the URI is the same before and after an iteration through the rules."
還有一個問題,那就是每個需要免除重寫的目錄都需要一個相對「昂貴」的正則表達式。這兩個問題都可以通過將每個靜態組件放入具有「不尋常」名稱的子目錄中來解決(實際上,這是最好的解決方案imo - 任何有更好主意的人都可以發佈它)。
目錄結構會再看看這樣的:
index.php
mystrangedir/js/
mystrangedir/css/
mystrangedir/imgs/
當然,這需要在代碼中插入隨處可見 - 與大現有的代碼庫項目,這可能會非常棘手。但是,你只需要目錄豁免一個正則表達式,則:
RewriteRule ^.*/mystrangedir/(.*)$ mystrangedir/$1 [L]
自動構建系統(如一飲而盡,咕嚕....)可以用來檢查是否「mystrangedir」不作爲目錄存在低於本身的任何地方(這將再次甩掉重寫引擎)。
隨意將mystrangedir
更名爲static_content
這樣的更明智的東西,但它更合理,它更有可能是目錄名已在某些庫中使用。如果你想要一個絕對安全的目錄名稱,它以前從未被使用過,請使用加密哈希,例如010f8cea4cd34f820a9a01cb3446cb93637a54d840a4f3c106d1d41b030c7bcb
。這相當長;您可以通過縮短它來在唯一性和正則表現之間進行權衡。
你能更清楚地描述出了什麼問題嗎? – 2011-04-29 09:29:28
您是否嘗試過'RewriteCond%{REQUEST_FILENAME}!-f'? – 2011-04-29 09:29:46
不幸運。 – 2011-04-29 09:36:35