# Apache模塊 mod_mime_magic
| [說明](#calibre_link-11) | 通過讀取部分文件內容自動猜測文件的MIME類型 |
| --- | --- |
| [狀態](#calibre_link-12) | 擴展(E) |
| [模塊名](#calibre_link-13) | mime_magic_module |
| [源文件](#calibre_link-14) | mod_mime_magic.c |
### 概述
本模塊采取Unix系統下`file(1)`命令相同的方法:檢查文件開始的幾個字節,來判定文件的[MIME類型](#calibre_link-223 "see glossary")。它被作為當`mod_mime`無法解析時,用來處理的"第二道防線"。
本模塊源自于Unix系統命令`file(1)`的一個自由版本,它通過對來自文件的內容使用"Magic數字"和其它一些線索來判定這個文件的具體內容是什么。本模塊只有當"Magic文件"在`MimeMagicFile`指令中指定時才有效。
## "Magic文件"的格式
Magic文件的內容是由4-5列的純文本組成的。文件中允許包含空行,但會被忽略。注釋行使用井號(`#`)來引導。剩余的行按下面列被分解:
| 列 | 描述 |
| --- | --- |
| 1 | 開始檢查的起始字節,">"表示基于前面的非">"行。 |
| 2 | 匹配的數據類型 `byte` 單個字符 `short` 機器字節順序的16位整數 `long` 機器字節順序的32位整數 `string` 任意長度的字符串 `date` 長整型的日期(從UNIX紀元/1970以來的秒數) `beshort` big-endian 16位整數 `belong` big-endian 32位整數 `bedate` big-endian 32位整型日期 `leshort` little-endian 16位整數 `lelong` little-endian 32位整數 `ledate` little-endian 32位整型日期 |
| 3 | 匹配的數據內容 |
| 4 | 如果匹配文件的MIME類型 |
| 5 | 如果匹配文件的MIME編碼方式(可選) |
例如,下面的Magic文件行可以認出一些音頻格式:
```
# Sun/NeXT audio data
0 string .snd
>12 belong 1 audio/basic
>12 belong 2 audio/basic
>12 belong 3 audio/basic
>12 belong 4 audio/basic
>12 belong 5 audio/basic
>12 belong 6 audio/basic
>12 belong 7 audio/basic
>12 belong 23 audio/x-adpcm
```
還有下面的示例可以區分帶`*.doc`擴展名的文件到底是Microsoft Word文檔還是Frame Maker文檔(兩種有相同后綴名但不兼容文件格式)。
```
# Frame
0 string \<MakerFile application/x-frame
0 string \<MIFFile application/x-frame
0 string \<MakerDictionary application/x-frame
0 string \<MakerScreenFon application/x-frame
0 string \<MML application/x-frame
0 string \<Book application/x-frame
0 string \<Maker application/x-frame
# MS-Word
0 string \376\067\0\043 application/msword
0 string \320\317\021\340\241\261 application/msword
0 string \333\245-\0\0\0 application/msword
```
一個可選的MIME編碼方式可以包含在第五列上。例如下面的行可以認出gzip壓縮文件并設定他們的編碼方式。
```
# gzip (GNU zip, not to be confused with
# [Info-ZIP/PKWARE] zip archiver)
0 string \037\213 application/octet-stream x-gzip
```
## 性能問題
并不是每個系統都適用本模塊的。如果你的系統吞吐量已經接近極限,或者你在進行web服務器的基準測試,你可能不希望啟動這個模塊,因為它的處理會顯著影響服務器的性能。
然而,已經有人在努力改進最初的`file(1)`代碼,使它能更適合在一個非常繁忙的web服務器上工作。這主要是用在那種有數千用戶自己發布文檔的web服務器上。這在互聯網上可能是非常常見的情況。很多情況下,如果服務器能就文件的內容作出比用文件名來區別的方式更加智能化的判斷是非常有用的。甚至在當用戶沒有合理地命名他們的文件的情況下,它也可以用來減少那些諸如:"為什么我的頁面不工作啊"之類的報怨。你必須自己決定這額外的開銷是否適用于你的環境。
## 注意
下面關于`mod_mime_magic`的記錄包含在這里,是按照最初捐助者的版權限制和為了得到他們的承認。
mod_mime_magic: 通過文件的Magic Number查找文件的MIME類型
Copyright (c) 1996-1997 Cisco Systems, Inc.
本軟件由Cisco系統有限公司于1997年7月提交給Apache組織。本軟件源代碼的進一步修訂及新版本的派生必須承認Cisco系統有限公司是本模塊的原始捐助者。所有其它許可與使用條件都屬于Apache組織。
本模塊的部分源代碼派生于最初發布在comp.sources.unix上的file命令的自由版本。根據要求,下面包含了那個程序的版權信息。
- Copyright (c) Ian F. Darwin, 1987\. Written by Ian F. Darwin.
本軟件不隸屬于美國電話電報公司(AT&T)或者加利福尼亞大學董事會的任何許可。
在遵循以下限制的基礎上,任何人被授權免費地在任何計算機系統上為任何目的使用、修改與重新分發這個軟件:
1. 不管后果有多嚴重,甚至是直接由于程序的缺陷造成的,程序的作者對于由于使用這個軟件而造成的任何直接或間接的后果不承擔任何責任。
2. 在清晰或冗長的聲明中,軟件的來源必須無誤地敘述。由于少量用戶可能會閱讀源代碼,源代碼中也必須包含這一聲明。
3. 改動版本必須明白標明,必須與原軟件嚴格區分開來。由于少量用戶可能會閱讀源代碼,源代碼中也必須包含這一聲明。
4. 本聲明不能被刪除或更改。
為了符合MrDarwin的條款:這是從自由的"file"命令而來并經過了明顯的修改的版本。
* 當從Apache的一個版本轉移到下一個時,為了編輯方便,所有代碼在一個文件中。
* 內存分配通過Apache應用程序接口的緩沖池結構完成。
* 在需要調用其它Apache應用程序接口例程的地方,所有的函數被提供必需的Apache應用程序接口及服務結構。(例如:通常在它自身或被調用的程序里包含了日志記錄,文件操作或內存分配)
* Magic結構從數組被轉換成了單終點鏈表,因為它每次只增長一條記錄,它只按順序方式處理,同時Apache API沒有realloc()的替代處理方法。
* 函數被改變成從參數獲取服務器配置,而不是全局變量。(現在它應該是可重入的,但沒有在線程化的環境中測試過)
* 原來用來打印結果到stdout的地方,被改成將結果保存到一個列表,這個列表被用來在Apache請求記錄中設置MIME類型。
* 因為在這里再也不會用到命令行標志,它們被刪除了。
## MimeMagicFile 指令
| [說明](#calibre_link-18) | 使用特定的Magic文件激活根據文件內容確定文件MIME類型的功能 |
| --- | --- |
| [語法](#calibre_link-19) | `MimeMagicFile file-path` |
| [作用域](#calibre_link-20) | server config, virtual host |
| [狀態](#calibre_link-21) | 擴展(E) |
| [模塊](#calibre_link-22) | mod_mime_magic |
`MimeMagicFile`指令用來激活本模塊,默認的Magic文件保存在`conf/magic`中。相對路徑是相對于`ServerRoot`的。虛擬主機會使用與主服務器相同的配置文件,除非使用了更特別的設定。在后者情況下,這些特別的設定會覆蓋主服務的設定。
### 示例
```
MimeMagicFile conf/magic
```
- Apache HTTP Server Version 2.2 文檔 [最后更新:2006年3月21日]
- 版本說明
- 從1.3升級到2.0
- 從2.0升級到2.2
- Apache 2.2 新特性概述
- Apache 2.0 新特性概述
- The Apache License, Version 2.0
- 參考手冊
- 編譯與安裝
- 啟動Apache
- 停止和重啟
- 配置文件
- 配置段(容器)
- 緩沖指南
- 服務器全局配置
- 日志文件
- 從URL到文件系統的映射
- 安全方面的提示
- 動態共享對象(DSO)支持
- 內容協商
- 自定義錯誤響應
- 地址和端口的綁定(Binding)
- 多路處理模塊
- Apache的環境變量
- Apache處理器的使用
- 過濾器(Filter)
- suEXEC支持
- 性能方面的提示
- URL重寫指南
- Apache虛擬主機文檔
- 基于主機名的虛擬主機
- 基于IP地址的虛擬主機
- 大批量虛擬主機的動態配置
- 虛擬主機示例
- 深入研究虛擬主機的匹配
- 文件描述符限制
- 關于DNS和Apache
- 常見問題
- 經常問到的問題
- Apache的SSL/TLS加密
- SSL/TLS高強度加密:緒論
- SSL/TLS高強度加密:兼容性
- SSL/TLS高強度加密:如何...?
- SSL/TLS Strong Encryption: FAQ
- 如何.../指南
- 認證、授權、訪問控制
- CGI動態頁面
- 服務器端包含入門
- .htaccess文件
- 用戶網站目錄
- 針對特定平臺的說明
- 在Microsoft Windows中使用Apache
- 在Microsoft Windows上編譯Apache
- Using Apache With Novell NetWare
- Running a High-Performance Web Server on HPUX
- The Apache EBCDIC Port
- 服務器和支持程序
- httpd - Apache超文本傳輸協議服務器
- ab - Apache HTTP服務器性能測試工具
- apachectl - Apache HTTP服務器控制接口
- apxs - Apache 擴展工具
- configure - 配置源代碼樹
- dbmmanage - 管理DBM格式的用戶認證文件
- htcacheclean - 清理磁盤緩沖區
- htdbm - 操作DBM密碼數據庫
- htdigest - 管理用于摘要認證的用戶文件
- httxt2dbm - 生成RewriteMap指令使用的dbm文件
- htpasswd - 管理用于基本認證的用戶文件
- logresolve - 解析Apache日志中的IP地址為主機名
- rotatelogs - 滾動Apache日志的管道日志程序
- suexec - 在執行外部程序之前切換用戶
- 其他程序
- 雜項文檔
- 與Apache相關的標準
- Apache模塊
- 描述模塊的術語
- 描述指令的術語
- Apache核心(Core)特性
- Apache MPM 公共指令
- Apache MPM beos
- Apache MPM event
- Apache MPM netware
- Apache MPM os2
- Apache MPM prefork
- Apache MPM winnt
- Apache MPM worker
- Apache模塊 mod_actions
- Apache模塊 mod_alias
- Apache模塊 mod_asis
- Apache模塊 mod_auth_basic
- Apache模塊 mod_auth_digest
- Apache模塊 mod_authn_alias
- Apache模塊 mod_authn_anon
- Apache模塊 mod_authn_dbd
- Apache模塊 mod_authn_dbm
- Apache模塊 mod_authn_default
- Apache模塊 mod_authn_file
- Apache模塊 mod_authnz_ldap
- Apache模塊 mod_authz_dbm
- Apache模塊 mod_authz_default
- Apache模塊 mod_authz_groupfile
- Apache模塊 mod_authz_host
- Apache模塊 mod_authz_owner
- Apache模塊 mod_authz_user
- Apache模塊 mod_autoindex
- Apache模塊 mod_cache
- Apache模塊 mod_cern_meta
- Apache模塊 mod_cgi
- Apache模塊 mod_cgid
- Apache模塊 mod_charset_lite
- Apache模塊 mod_dav
- Apache模塊 mod_dav_fs
- Apache模塊 mod_dav_lock
- Apache模塊 mod_dbd
- Apache模塊 mod_deflate
- Apache模塊 mod_dir
- Apache模塊 mod_disk_cache
- Apache模塊 mod_dumpio
- Apache模塊 mod_echo
- Apache模塊 mod_env
- Apache模塊 mod_example
- Apache模塊 mod_expires
- Apache模塊 mod_ext_filter
- Apache模塊 mod_file_cache
- Apache模塊 mod_filter
- Apache模塊 mod_headers
- Apache模塊 mod_ident
- Apache模塊 mod_imagemap
- Apache模塊 mod_include
- Apache模塊 mod_info
- Apache模塊 mod_isapi
- Apache模塊 mod_ldap
- Apache模塊 mod_log_config
- Apache模塊 mod_log_forensic
- Apache模塊 mod_logio
- Apache模塊 mod_mem_cache
- Apache模塊 mod_mime
- Apache模塊 mod_mime_magic
- Apache模塊 mod_negotiation
- Apache模塊 mod_nw_ssl
- Apache模塊 mod_proxy
- Apache模塊 mod_proxy_ajp
- Apache模塊 mod_proxy_balancer
- Apache模塊 mod_proxy_connect
- Apache模塊 mod_proxy_ftp
- Apache模塊 mod_proxy_http
- Apache模塊 mod_rewrite
- Apache模塊 mod_setenvif
- Apache模塊 mod_so
- Apache模塊 mod_speling
- Apache模塊 mod_ssl
- Apache模塊 mod_status
- Apache模塊 mod_suexec
- Apache模塊 mod_unique_id
- Apache模塊 mod_userdir
- Apache模塊 mod_usertrack
- Apache模塊 mod_version
- Apache模塊 mod_vhost_alias
- Developer Documentation for Apache 2.0
- Apache 1.3 API notes
- Debugging Memory Allocation in APR
- Documenting Apache 2.0
- Apache 2.0 Hook Functions
- Converting Modules from Apache 1.3 to Apache 2.0
- Request Processing in Apache 2.0
- How filters work in Apache 2.0
- Apache 2.0 Thread Safety Issues
- 詞匯和索引
- 詞匯表
- 指令索引
- 指令速查
- 模塊索引
- 站點導航