Apache+mod_encoding解決URL中文編碼問題


我們經常在論壇上看到這樣的求救貼: 
為什么我看不了網站上中文文件名的文件?這時一定會有好心的大俠告訴說,到IE6的工具,Internet選項, 高級里,把"總是以UTF-8發送URL"去掉.... 於是世界清凈了。為什么會這樣?
 
我們來看這樣一個例子:
如果是在瀏覽器里輸入這樣一個路徑 : http://hi.baidu.com/uroot/中文.mp3.對對於包含中文URL來說,那么瀏覽器會把"中文" 以類似%HH的方式編碼. 那么,http 客戶端到底是以GBK編碼還是UTF-8編碼呢?
在IE里,有這樣一個選項,“總以UTF-8發送URL”.而且是缺省的設置。但不是所有的http 客戶端都是這樣。比如Firefox就是直接以GBK編碼(在這里,我們都假定操作系統為Windows簡體中文版本)於是,Apache服務器端在獲得這樣的url時,就可能出現傳過來的編碼不一樣的請求,但是他們請求的目的其實是一個文件。
 
下面看Apache如何處理這2個請求:
對於Apache 來說,它很郁悶的是URL中不會包含任何編碼信息,那么它能做的事情最簡單的就是接收到文件名后,就原樣對文件系統(操作系統)直接發起請求讀這個名字的文件。
對於文件系統來說,肯定是一種編碼,例如 UTF-8.那么就意味着apache以GBK編碼文件名的請求反饋結果是沒找到~~~~ 於是Apache 給http 客戶端 送了一個對不起, 404... 
所以從用戶端看就有很奇怪的事情發生了:用IE(選中UTF-8發送URL)訪問(下載)這個mp3文件URL,一切正常。用下載工具比如flashget 或者firefox 訪問(下載)這個文件,得到404文件不存在的錯誤!
通過上面的解釋, 對於IE訪問www網站中文文件名文件訪問出404文件沒找到錯誤的情況,IE把"總是以UTF-8發送URL"選項uncheck的就可以成功的www服務器,我們可以推測出WWW服務器端文件系統采用了GBK編碼。
那么我們有沒有辦法解決這個問題呢,讓Apache 管它是UTF-8還是GBK通吃.要知道,總會有些特殊需求在URL中有中文的。雖然我們極力避免這樣去做。
 
廢話說了一堆,下面是使用mod_encoding解決這個問題的一個方法:
 
1.下載mod_encoding和安裝patch補丁
http://webdav.todo.gr.jp/download/mod_encoding-20021209.tar.gz
# cd /data/soft
# tar -xvf mod_encoding-20021209.tar.gz
 
另外這里必須要打一個apache的補丁。否則make也會出apxs rc=65536的錯誤。
http://d.nicwind.com/files/mod_encoding_64.tar.gz
# tar -xvf mod_encoding_64
# cd mod_encoding_64
# cp mod_encoding.c-apache2.2-20060520.patch /data/soft/mod_encoding-20021209
# patch -p0 < mod_encoding.c-apache2.2-20060520.patch
 
2.安裝 iconv-hook
# cd mod_encoding-20021209/lib
# ./configure --prefix=/usr
# make
# make install
# ldconfig
 
3.編譯 mod_encoding
# cd ..
# ./configure --with-apxs=/data/apache/bin/apxs --with-iconv-hook=/usr/local/include
查看是否已經生成了mod_encoding.o文件,如果有,則make成功繼續下邊的操作。
# make
# gcc -shared -o mod_encoding.so mod_encoding.o -Wc,-Wall -Llib -liconv_hook
 
4 配置 apache 
# cd /data/apache/conf/httpd.conf
 
LoadModule headers_module modules/mod_headers.so
LoadModule encoding_module modules/mod_encoding.so
 
Header add MS-Author-Via "DAV"
EncodingEngine on
NormalizeUsername on
SetServerEncoding GBK
DefaultClientEncoding UTF-8 GBK GB2312
AddClientEncoding "(Microsoft .* DAV $)" UTF-8 GBK GB2312
AddClientEncoding "Microsoft .* DAV" UTF-8 GBK GB2312
AddClientEncoding "Microsoft-WebDAV*" UTF-8 GBK GB2312
 
4.重啟 apache,如果沒有報錯則成功。
# /data/apache/bin/apachel restart


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM