2012-04-09 65 views
0

我有一個非常有趣的與Deflate Compression,Apache(htaccess)和CSS文件相關的問題。瀏覽器不解釋.css在.htaccess中使用AddType .css時的文件

我在我的服務器上有兩個CSS文件。一個名爲styles.php,並且通過styles /目錄中的mod_rewrite根據數據庫值添加了動態值(它從styles.php重寫爲site.css,並且在文件開始處有一個text/css頭)。我還有一個靜態內容的常規舊css文件,它在名爲styles.css的同一目錄中不會更改。

我想爲我的網站添加壓縮,所以我添加了以下行來開始壓縮我的CSS和js文件。我將其添加到我的網站的root_directory。

<ifModule mod_deflate.c> 
    <filesMatch "\.(js|css)$"> 
     SetOutputFilter DEFLATE 
    </filesMatch> 
</ifModule> 

那麼最初沒有工作。所以我改變了根htaccess文件中的這一行,從此到下一件事。 (此代碼如下位於文件的頂部)

AddType application/x-httpd-php5 .html .php 
AddType application/x-httpd-php5 .html .php .js .css 

然後我的js和css文件的一個開始被壓縮(與YSlow的驗證.....耶!)。奇怪的是被重寫的css文件被壓縮(styles.php文件),但styles.css文件(靜態文件)不再被瀏覽器讀取。只要我從該AddType行中刪除「.css」,瀏覽器就開始再次讀取文件,並且我的css恢復正常,但不再通過apache壓縮。

任何想法爲什麼靜態css文件沒有被瀏覽器讀取,如果我添加類型?我只用text/css而不是.css來嘗試它,它不是壓縮文件(但是瀏覽器解釋它)。

更新:

我將此添加到root htaccess文件。我們現在已經壓縮,解釋了甜頭。

<filesMatch "\.css$"> 
FileETag None 
<ifModule mod_headers.c> 
Header set Content-type "text/css" 
</ifModule> 
</filesMatch> 
+0

你是否收到這個靜態css文件的正確的'Content-Encoding'和'Content-Type'頭文件? – 2012-04-09 21:38:42

回答

2

當您運行通過PHP預處理器CSS文件,PHP會自動輸出它作爲一個text/html文件,通過默認的頭,因爲你不手工指定它。所以真的,你的瀏覽器正在接收一個擴展名爲.css的文件,其頭文件聲稱它是一個HTML文件,所以它試圖將其解釋爲HTML而不是CSS。

如果你的CSS文件實際上需要運行PHP和有PHP中,你需要重新發布相應的文件類型,所以當它的輸出,它仍然是CSS:

<?php 
header('Content-type: text/css'); 
?> 

你可以只是通過PHP發送一個CSS文件,並期望它工作完全相同。如果你實際上沒有用PHP預處理它,那麼你不應該通過它發送它。


至於通縮問題,我永遠無法真正獲得mod_deflate親自工作(不知道爲什麼)。我不得不使用mod_gzip。

+0

也許我們中的一個人不在同一頁面上。這個文件是styles.php(我的頭文件是'Content-type:text/css');那個文件實際上是按照它應該的那樣工作的。靜態styles.css文件(不含PHP)是不起作用的文件。但我做了一個雙重檢查和靜態的CSS文件(。css)被解釋爲text/html。 – n0nag0n 2012-04-09 21:37:06

+1

@ImmortalFirefly:是的,但你運行style.css *通過* PHP(通過設置它的類型爲'application/x-httpd-php5'),這看起來你沒有設置Content-type(沒有PHP ),並將其設置爲「text/html」。 – animuson 2012-04-09 21:37:51