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

标签 php css apache .htaccess stylesheet

我有一个与 Deflate 压缩、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>

嗯,最初那行不通。所以我将根 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 并且它没有压缩文件(但浏览器解释了它)。

更新:

我将其添加到根 htaccess 文件中。我们现在已经压缩、解释了甜蜜。

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

最佳答案

当您通过 PHP 预处理器运行 CSS 文件时,PHP 将通过默认 header 自动将其输出为 text/html 文件,因为您没有手动指定它。实际上,您的浏览器正在接收一个扩展名为 .css 的文件,该文件的 header 声称它是 HTML 文件,因此它试图将其解释为 HTML 而不是 CSS。

如果你的CSS文件确实需要以PHP的形式运行,而且里面有PHP,你需要重新下发合适的文件类型,这样输出的时候还是CSS:

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

您不能只通过 PHP 发送 CSS 文件并期望它的工作完全相同。如果您实际上没有使用 PHP 对其进行预处理,那么您不应该通过那里发送它。


至于通货紧缩问题,我从来没有真正让 mod_deflate 亲自工作(不知道为什么)。我不得不改用 mod_gzip。

关于php - 在 .htaccess 中使用 AddType .css 时浏览器不解释 .css 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10080103/

相关文章:

php file_get_contents 向 Bugzilla 安装发送错误的内容类型

javascript - 在 Bootstrap 中单击按钮,如何切换导航类?

CSS transform transition layout flash in WebKit(可能是布局缓存导致的?)

java - 将 MultiPartFile 转换为 XWPFDocument

php - 如何在 Mac OS Mojave 上编译和使用 php 扩展

php - 向通过 PHP 上传的文件添加时间戳和自定义名称

php - 尝试从 URL 中提取 XML 文件,然后提取标签内包含的属性

javascript - jQuery .prop ('checked' ) 不更改 HTML 中实际检查的属性

javascript - 在没有干预文本节点的情况下选择相邻的兄弟节点

html - 在非根位置部署的绝对路径