![Apache2:使用符号链接的目标名称进行 Content-Type 映射](https://linux22.com/image/624723/Apache2%EF%BC%9A%E4%BD%BF%E7%94%A8%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%E7%9A%84%E7%9B%AE%E6%A0%87%E5%90%8D%E7%A7%B0%E8%BF%9B%E8%A1%8C%20Content-Type%20%E6%98%A0%E5%B0%84.png)
我正在开发一个 Web 应用程序,需要在静态 URL 上提供大量不断更新的文档,但文档的 Content-Type 不同(要么是 JPEG,要么是 SVG)。如果文档是符号链接,则链接末尾的文件具有正确的 MIME 类型映射文件扩展名,但我不知道是否可以在查找 MIME 表中的扩展名之前让 Apache 跟踪该链接。
这个问题问同样的问题,但是提供的解决方法对我来说不起作用,因为如果我提供 image/jpeg,浏览器不会自动检测 SVG(它们会自动检测 GIF 和 PNG),所以我需要一个合适的 MIME 类型。
通常情况下,我会使用 .meta 文件和mod_cern_meta为此,但我的目标 Linux 发行版(Fedora 19/20、RHEL 7)没有附带此功能,我想避免自己提供它。我认为我不能使用 mod_headers,因为它需要我重写整个 .htaccess 文件(文件会逐个更改),也不能使用 mod_asis,因为数据文件本身是使用第三方工具生成的。
编辑:我通过将文件写为类型映射(仅包含一个条目)来解决这个问题,指向实际资源并列出其内容类型。这意味着必须编写额外的文件,但使用 mod_meta 也是如此。目前效果还不错。
答案1
你有没有尝试过mod_mime_magic? 启用此模块后,apache 可以按照与“文件”命令相同的方式猜测内容类型,并正确设置内容类型标头。
检查 centos httpd 安装的默认配置,mod_mime_magic 似乎默认启用,并且当(例如)请求针对 .png 文件的符号链接(即“aaaa”)时,内容类型设置正确。
另外,请确保您有跟随符号链接为包含符号链接的根目录启用选项(或仅为整个 documentroot 启用它)
lrwxrwxrwx 1 root root 10 Jan 15 16:27 aaa -> pgid35.png
-rw-r--r-- 1 root root 229727 Jan 15 16:26 pgid35.png
HEAD http://localhost/tt/aaa
200 OK
Connection: close
Date: Wed, 15 Jan 2014 13:27:30 GMT
[...]
Content-Length: 229727
Content-Type: image/png <<<--- [[bullseye]]
Last-Modified: Wed, 15 Jan 2014 13:26:47 GMT
[...]
为简洁起见,我将包含一些 apache httpd 的配置提示,以使 mime magic 发挥作用:
#assuming the module folder is linked within apache root config dir as 'modules'
LoadModule mime_magic_module modules/mod_mime_magic.so
#define the magic file containing patterns for identifying file types
MIMEMagicFile conf/magic
#the system magic file normally contains more patterns than
#the default http magic file
#centos magic file install path:
#MIMEMagicFile /usr/share/misc/magic
#do follow the symlinks if you are using them
<Directory />
Options FollowSymlinks
</Directory>
答案2
如何让您的静态 URL 不直接指向文档,而是指向设置正确的 Content-Type 标头然后流式传输文档的简单脚本?
<?php
$filename = "path/to/your/file";
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($finfo, $filename);
finfo_close($finfo);
header("Content-Type: ".$mimetype );
echo readfile($filename);
?>