2012-07-23 139 views
5

我有一個mod_rewrite條件/規則奇怪的問題。mod_rewrite不加載css和js文件

這是我正在使用的條件和規則。

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 

RewriteRule ^(.*)$ index.php?params=$1 [QSA,L] 

我的問題是,如果我訪問www.example.com和www.example.com/page它加載罰款,但是當我嘗試加載www.example.com/page/category它加載的頁面,但不能找到CSS和JavaScript。它試圖從page/css而不是/目錄加載它們。

對我做錯了什麼想法?我對這裏搜索,並嘗試了一些事情,如添加

RewriteCond $1 !\.(js|ico|gif|jpg|png|css|html|swf|mp3|wav|txt)$ 

RewriteRule ^(images|css|javascript)(.*)$ index.php?params=$1 [QSA,L] 

但是,這似乎並沒有太大的差別。

感謝您閱讀

回答

2

的問題是,一個無聲的重寫不會告訴訪問者的網絡瀏覽器,他們實際上是在不同的目錄路徑尋找一個頁面。

因此,對/頁面的請求會使瀏覽器(正確)認爲它正在查看位於Web服務器頂層公共目錄中的資源,就像圖像和CSS文件一樣。

但是/ page/category的請求會讓瀏覽器(錯誤地)認爲它正在查看名爲page的子目錄中的資源。因此,當瀏覽器發送CSS和圖像文件的請求時,它會要求服務器在/ page /子目錄中查找它們,但這並不存在。因此,當瀏覽器嘗試獲取圖像和CSS文件時,服務器返回404代碼。

解決此問題的一種方法是將CSS,圖像和其他頁面引用資源的路徑更改爲絕對路徑。用正斜槓啓動它們,以便它們相對於實際的頂層公共目錄進行錨定。如果您只有少量資源路徑需要更新,這可能是繼續進行的最佳方式。例如,更改:

src="image-name.png" 

src="/image-name.png" 

這將迫使瀏覽器中使用絕對路徑,請求文件,而不是基於推斷的相對路徑的錯誤位置。

要刪除需要進行的RewriteCond,您可以將您的重寫規則更改爲以下:

RewriteRule ^([a-z]+(?:/[a-z]+)*)$ index.php?params=$1 [QSA,L] 

這將不會匹配任何包含一個句點符號,所以對於圖像和CSS文件的請求,將被跳過。

1

你有沒有考慮過只使用base element,並刪除圖像之前的「/」?