让Apache/PHP为作为PHP执行的文件设置基于文件扩展名的MIME类型


Have Apache/PHP set MIME type based upon file extension for files being executed as PHP

我有一个基于Apache/PHP的服务器,我通过/etc/mime.types中的以下行使Apache将jshtmlcss文件作为PHP执行:

application/x-httpd-php phtml pht php js html css

我们这样做是因为,即使我们保存为.html/.js/.css的任何文件几乎都是非PHP的,我们也需要在其中进行一些模板化(例如,根据我们是在实时服务器上还是在测试服务器上更改某些URL的域)。

问题是,这种让Apache将这些文件视为PHP的方法会导致它们返回错误的MIME类型,这至少会破坏Chromium中的css文件,并且可能在其他浏览器中也会产生恶劣的影响。

有没有一种方法可以告诉Apache将这些文件作为PHP执行,但仍然使用正确的MIME类型作为文件扩展名输出?我不想手动粘贴

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

位于我们所有.css文件的顶部。

值得我注意的是,我最终需要问这个问题的唯一原因是我在用PHP执行.js.css文件时采取了错误的方法。

不要修改mime.types文件来实现这一点。相反,在Apache配置(或.htaccess文件)中,使用如下调用:

<Files *.js>
    ForceType application/x-httpd-php
    Header set Content-Type "application/javascript"
</Files>
<Files *.css>
    ForceType application/x-httpd-php
    Header set Content-Type "text/css"
</Files>

我们这样做是因为即使我们保存为.html/.js/.css的任何文件几乎都是非PHP的,我们也需要在它们中做一些模板化

为什么不在主文档中做动态部分呢?通过PHP解释器运行所有资源是一种浪费。

对于JavaScript:

<script>
domain = "<? echo $domain; ?>";  <----- dynamic bits here
</script>
<script src="xyz.js"></script>   <----- you can use them in xyz.js

对于CSS:

<link rel="stylesheet" href="stylesheet.css">
<style type="text/css">
 /* insert dynamic CSS here, overriding parts from the static style sheet */
 .my_div { color: <? echo $color; ?> }
</style>

您可以通过两种方式实现:

  1. 创建一个.htaccess文件。

    现在在这个文件中,将所有PHP文件读取为.js.css。理想情况下,您将拥有style.css.phpscripts.js.php等文件,这些文件由Apache执行,但用户将获得style.cssscripts.js等URL。

  2. 使用Mime类型

    正如您已经说过的,通过使用以下命令,您可以在PHP中执行这些命令。

    application/x-httpd-php phtml pht php js html css
    

    或者另一种方式是:

    <FilesMatch "^.*?css*?$">
        SetHandler php5-script
    </FilesMatch>