libmagic. 将text/javascript和text/css识别为text/plain

3

我在我的项目的Web界面中使用libmagic获取文件的MIME类型。在CSS和JS文件上,我获取到text/plain MIME类型。

例如,Chromium显示以下警告:

Resource interpreted as Stylesheet but transferred with MIME type text/plain: "http://localhost:8000/jquery-ui.css".
Resource interpreted as Script but transferred with MIME type text/plain: "http://localhost:8000/jquery.timers.js".

HTTP 对话框

alex@alex-laptop ~ $ nc localhost 8000
GET /ui.css HTTP/1.1


HTTP/1.1 200 OK
Connection: close
Content-Length: 699
Content-Type: text/plain; charset=us-ascii
Date: Wed, 19 Sep 2012 11:41:48 GMT

...

我该如何修复这个问题?

你为什么要使用libmagic呢?.css和.js的mime类型已经定义好了,你不需要去猜测它们(而这正是libmagic所做的)。 - Joachim Sauer
我使用许多不同类型的文件。我不想硬编码它们的 MIME 类型。 - alex_ac
2个回答

4

不确定您为什么需要这个。

通常,您可以通过扩展名、目录等了解哪些文件是什么。

最简单的方法是检查扩展名,但猜测由于某种原因,这不是一个选项。

您可以自定义函数来解析和检测ecma和css:

if (mime==text/plain) { mime = my_parser(data); }

您可以使用验证器来检查它是否符合CSS或JS的规范。

您可以制作自己的magic模式文件,在其中测试您想要的内容-虽然容易出错;

例如(非常简化)...

文件my.magic:

0        search/4096    =function\ 
>&0      search/128     =)
>>&0     search/128     ={              JavaScript
!:mime   application/javascript

0        search/4096    ={
>&0      search/512     =transition-    CSS3
!:mime   text/css

0        search/4096    ={
>&0      search/512     =background:    CSS
!:mime   text/css

0        search/4096    ={
>&0      search/512     =color:         CSS
!:mime   text/css

然后编译它:

$ file -C -m my.magic

并使用:

$ file -im my.magic.mgc some_file

3

您需要和Apache一样做的事情:查询扩展名与MIME类型的数据库,如果查询失败,则要使用libmagic进行查询。

文本和XML文件通常太泛泛而论,难以被libmagic确定其类型。libmagic仅通过检查几个字节来确定文件类型,因此CSS和JavaScript并不足以区分它们的确切类型。在XML的情况下,libmagic需要具有相当复杂的规则,才能确定一个文件是否为XHTML、SVG、XHTML+SVG或生成XHTML和/或SVG的XSLT。这超出了其范围。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接