在.htaccess中使用AddType .css时浏览器不解释.css文件

时间:2012-04-09 21:26:37

标签: php css apache .htaccess stylesheet

我有一个与Deflate Compression,Apache(htaccess)和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>

最初这不起作用。所以我将root htaccess文件中的这一行从这个改为下一个。 (以下代码位于文件顶部)

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

然后我的js和其中一个css文件开始被压缩(用YSlow验证..... yay!)。奇怪的是被重写的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>

1 个答案:

答案 0 :(得分: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。