百度空间 | 百度首页 
               
 
查看文章
 
[Server]Windows平台上的mod_encoding.dll For Apache 2.2 的编译和配置方法 2008.1.31
2008-01-31 13:23
       作者:Tank http://hi.baidu.com/uroot   2008.1.31 Tank原创,转载请保留本出处
  
   更新: 1.提供编译好的mod_encoding.dll For Apache 2.2.x Win32 下载,地址见下文 2008.7.23
                2.增加配置方法说明
编译
      前日写篇[Linux]Apache2.2+mod_encoding解决URL中文编码问题-2008.1.8的文章.有网友咨询Apache 运行在Windows Server 2003平台上如何处理。由于mod_encoding没有提供For Apache 2.2 的Windows 版本,Google了一通无现成dll可用,于是试着自己在Windows 平台编译了mod_encoding.dll.将过程贴出分享:
    mod_encoding 使用libiconv,所以,首先需要一个iconv的win32版本。 libiconv 的老家是 http://www.gnu.org/software/libiconv/
我在这里找到一个libiconv的windows版本:
http://www.zlatkovic.com/pub/libxml/
下载释放到某个目录,例如C:\iconv-1.9.2.win32
  
   开发环境:Windows XP, VS 2005,已经安装Apache 2.2.8 类似mod_limitipconn 编译环境

   Vs2005新建立一个dll项目 项目名称mod_encoding
   加入mod_encoding.c 这个文件从打好补丁的linux版本直接拿过来。参考相关文章2.

修改头文件引用方式#include "httpd.h"
   #include "iconv.h"
    作者:Tank http://hi.baidu.com/uroot 原创
   配置 项目属性,附加 include目录 和链接附加依赖项, 可参考相关文章1中配置, 记得需要加入iconv的lib文件,include目录
     这时候编译可以通过。Link出错。由于Linux C index 函数的原因.
    替换index 为win32 的strstr .
    重新编译通过。
---------------------------------------------------------------------------------------
配置
   httpd.conf中 配置文件写法同Linux版本相同.

使用环境:apache 2.2.x ,WIndows Server 2003 or Windows XP
首先保证你的apache2.2.x能正常启动,并提供服务。IE访问服务器HTTP时出现It works 字样。
1:你需要到http://www.zlatkovic.com/pub/libxml/ 下载一个iconv-1.9.2 的 iconv.dll 放到windows system32目录.如果链接iconv时选择静态链接库iconv_a.lib.则不需要此步骤。其他如MSVCRT80.DLL等,如果需要,一并部署到目标Server 的system32目录.
2:拷贝mod_encoding.dll到Apache modules目录。比如C:\apache2\modules
3.修改apache的conf子目录中的配置文件: httpd.conf
加入如下配置:
LoadModule headers_module modules/mod_headers.so
##mod_headers必须加载
LoadModule encoding_module modules/mod_encoding.dll
<IfModule mod_headers.c>
Header add MS-Author-Via "DAV"
</IfModule>
<IfModule mod_encoding.c>
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
</IfModule>
然后重新启动apache 。 如果apache启动出错,请看apache 安装目录下logs子目录的error.log的错误提示.


    (Tank注:因无条件测试,不能保证此dll能正常使用,请自行测试)
  
(Tank注2:有网友反馈在Windows Server 2003上可正常使用)
    (留言中,jaco的建议很有道理,不是每个人都常备一个vs200x的开发环境,由于没有合适的server 空间提供dll下载,所以朋友如果需要编译好的dll,请给我留言,不知道为什么,baidu的留言有时会莫名其妙的没有了。....前两位的留言就不见了.)

   更新,mod_encoding.dll For Apache 2.2 Win32下载地址如下:
    http://codebase.blogbus.com/files/12168083980.zip
    链接在 坦克工厂@blogbus.com mod_encoding.dll 下载地址页面 (博客大巴有文件防盗链设置,不能直接从百度链接到文件?)

1:
Windows 2003 平台 Apache 2.2.6 +mod_limitipconn+ PHP 5 + SQL SERVER 2005 配置 -2007.11.08
2:
[Linux]Apache2.2+mod_encoding解决URL中文编码问题-2008.1.8

类别:linux/win/server | 添加到搜藏 | 浏览() | 评论 (13)
 
网友评论:
1
2008-03-07 15:56 | 回复
问个相关问题,我的php程序是将中文文件名进行urlencode编码存入数据库中,使用apache1.3.7版本可以直接用数据库中的编码地址进行访问,但换成了apache2.2版本后就不行了,开启apache目录资源浏览功能看到的资源地址编码和数据库中完全不同,这应该怎么解决? 文件名称: 12048706586549348088友情链接.gif 数据库内的存储编码: 12048706586549348088%D3%D1%C7%E9%C1%B4%BD%D3.gif apache资源链接地址: 12048706586549348088%e5%8f%8b%e6%83%85%e9%93%be%e6%8e%a5.gif
 
2
2008-03-07 17:57 | 回复
数据库内的存储编码: 12048706586549348088%D3%D1%C7%E9%C1%B4%BD%D3.gif 这个地址是GBK编码 12048706586549348088%e5%8f%8b%e6%83%85%e9%93%be%e6%8e%a5.gif UTF8编码 可以在apache2.2中用这个mod_encoding把所有的GBK编码url请求转化为UTF8编码url,就像直接用apache目录流浪功能看到的地址一样就应该可以。
 
6
2008-07-15 11:34 | 回复
你好,能不能发一份编译好的DLL到我的邮箱,谢谢!
 
7
2008-07-20 21:39 | 回复
麻烦把编译好的文件分享一份到我的邮箱,不甚感激 Simxinzi@hotmail.com
 
8
2008-11-25 12:05 | 回复
我在XP下運行,如果網頁文件名為中文依然無法訪問,會出現奇怪的403 [Tue Nov 25 12:00:04 2008] [error] [client 172.16.175.50] (22)Invalid argument: Cannot map GET /%E4%B8%8D%E9%9C%80%E8%A6%81%E6%BF%80%E6%B4%BB%E7%9A%84%E6%A0%B7%E6%9D%BF.htm HTTP/1.1 to file
 
10
2008-11-25 17:25 | 回复
to Nakun: 看你的这个error log ,应该是在映射时出了问题。如果是没有做映射,出的错误会是404 . 你可以把你详细的配置过程和配置文件描述下。 曾经在Windows XP SP3简体中文专业版 +apache 2.2.x 上测试没有问题。也是这个dll的编译环境。
 
11
2009-05-22 18:12 | 回复
您好,急需您的帮助,按照上面的方法我都弄好了,但是不好使,依然访问不到,我的服务器是TOMCAT和apache一起用的,把apache的代理关了不用tomcat,只用apache的时候是好用的,但是整合后又不行了
 
12
2009-05-22 18:14 | 回复
麻烦帮解释一下,谢谢
 
13
2009-05-25 21:18 | 回复
回复skynofeng:
请把故障细节描述下,以及详细配置情况说明下,比如你的apache和tomcat整合的方式是ajp proxy还是如何。否则真是不好定位。
 
14
2009-06-01 16:49 | 回复
你好,我使用了这个东西,是tomcat生成链接和文件,然后由tomcat redirect到apache上实现下载的分流,tomcat和apche基本没有关系,但 如果生成链接的附件名称为“通知.doc”时不能通过转向的链接下载,很是奇怪。不知道
 
15
2009-06-02 21:10 | 回复
回复ztoopoo:
       我理解你的做法是URL由java应用生成,连接到apache上下载。这样的话,只要链接URL正确,apache配置正确。二者互相没关系,应该能正常运行。
       你需要测试下各种情况,隔离下错误。
       1不用tomcat生成链接。直接在apache下防止中文文件名的文件,用UTF8和GBK两种编码生成URL访问,看能否下载。如果都正常,apache配置正常。
       2.验证tomcat下的java 应用生成的中文名附件的URL是否编码成正确的URL。
       3. 点击2中的URL是否能访问到apache.看apache access /error log.确定错误提示。
 
16
2009-06-03 10:37 | 回复
回复codebase:你好,我上面的做法在IE7及8下下载都正常,但是只有IE6下“通知.doc”这个附件不能下载,IE6下载其他文件名的附件都能下载,很是奇怪,error.log如下,apache配置只有SetServerEncoding和你上面不同,我的为UTF-8,其它均相同。
[Mon Jun 01 17:28:44 2009] [error] [client 127.0.0.1] File does not exist: D:/Program Files/Apache Software Foundation/Apache2.2/htdocs/7840959885094338647/\xcd\xa8\xd6\xaa.doc
我的感觉是,他把通知这两个字当英文字符处理了,比如我把“通知”改为“我通知”则可以下载,并且只在IE6下出问题,这个问题困惑我很久了。我现在暂时的解决办法就是,在每个附件的名子前都加一个全角空格,这样就不会出问题。
 
17
2009-06-03 20:36 | 回复
回复ztoopoo:
看你的errorlog.应该是IE6的给URL中包含特定中文做URL编码出现错误造成的。
你可以把IE6里看到的html中的url 的ascii码和apache access log中的url 比较。
问题就应该能定位了。

其实你这个java 生成url完全没有必要这样处理,直接用utf8编码的中文文件名然后urlencode,避免了中文url.用户端访问就没有中文问题了。
例如这样http://www.example.com/att/%xx%xx%xx.doc这样。


 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu