2011-04-29 144 views
6

嗨,我有一個問題。 我想讓所有的請求重定向到主目錄中的索引文件,我已經實現了這一點,但是相對路徑存在問題。
當我把地址,如:mydomain.com/something它工作正常,因爲路徑是相對於主目錄。
問題是當我把這樣的東西:mydomain.com/something/somethingelse。相對路徑的mod_rewrite問題css/js

.htaccess文件:


Options FollowSymLinks 
RewriteEngine On 
# ignore anything that's an actual file 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f 
# redirect all other traffic to the index page 
RewriteRule . index.php [L] 

如何讓CSS/JS工作的任何想法?


編輯:

的是,CSS/JS文件不會被加載的問題時輸入的路徑有多個斜線
,如:mydomain.com/something/somethingelse

+0

你能更清楚地描述出了什麼問題嗎? – 2011-04-29 09:29:28

+0

您是否嘗試過'RewriteCond%{REQUEST_FILENAME}!-f'? – 2011-04-29 09:29:46

+0

不幸運。 – 2011-04-29 09:36:35

回答

11

毫無疑問最好使用靜態文件(css,js,images等)的絕對路徑。但是,如果您在多個頁面中提供了大量實例,請考慮使用HTML base tag指定相對路徑的默認URL。例如:

<base href="http://www.example.com/static/" /> 
+1

你是救星我的一天! – Cammy 2015-06-01 23:32:08

1
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule . index.php [L] 

應該儘管有評論,但顯然仍在工

嘗試添加RewriteLog和RewriteLogLevel指令以提供更好的細節。

1

這是一個路徑解析問題:當使用基本路徑/something它決心/css同時/something/somethingelse它解析爲/something/css上的相對路徑./css

這不能(或者不應該)用mod_rewrite修復。使用絕對路徑代替相對路徑,所以/css而不是./css

2

使用<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。這相當長;您可以通過縮短它來在唯一性和正則表現之間進行權衡。