免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4828 | 回复: 8
打印 上一主题 下一主题

[Web] 有哪些系统设置可能导致Apache无法使用中文url? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-15 22:40 |只看该作者 |倒序浏览
[Thu Feb 15 22:23:34 2007] [error] [client x.x.x.x] (22)Invalid argument: Cannot map GET /%CE%C4%BC%FE/t.txt HTTP/1.1 to file

Win2003中文版/Apache 2.2.4/php 5.2.11
服务可以正常启动,和正常解析PHP脚本

但是url中不能正常使用中文,一访问日志里面就出上面那个提示

从服务器上把 apache和php整个复制下来,又可以使用中文

服务器和本地操作系统一样,不过一个是sp1的,一个没有sp,附图,左边是服务器,右边是本机

难道sp1里面有什么东西能影响apache的行为?

已经换了很多个不同的关键字搜索了,没找到类似情况,所以来问问,有没有哪位了解一些的

又看了下日志,发现,用 firefox 和用 ie 对中文的编码是不一样的,firefox发送到服务器的是两字节编码,而IE发送到服务器的应该是三字节编码,服务器接受三字节编码的,这是为什么?有什么方法可以使服务器接受两种编码?

[ 本帖最后由 Namelessxp 于 2007-2-15 23:15 编辑 ]

tt.jpg (157.52 KB, 下载次数: 36)

tt.jpg

论坛徽章:
0
2 [报告]
发表于 2007-02-16 01:34 |只看该作者
--

我猜三字节的是 UTF-8
二字节的是 GB*

强制字符编码试试

--

论坛徽章:
0
3 [报告]
发表于 2007-02-16 11:05 |只看该作者
原帖由 langue 于 2007-2-16 01:34 发表
--

我猜三字节的是 UTF-8
二字节的是 GB*

强制字符编码试试

--


怎么个强制法?找遍那个配置文件,看不到和编码有关的
改 language 和 charset 都没用

论坛徽章:
0
4 [报告]
发表于 2007-02-16 19:48 |只看该作者
小顶一下,看有没有人知道 ^_^

论坛徽章:
0
5 [报告]
发表于 2007-02-23 23:38 |只看该作者
原帖由 Namelessxp 于 2007-2-16 19:48 发表
小顶一下,看有没有人知道 ^_^


因为你的 ie 传送的是 utf-8 编码的 url request,但是你的 linux 本身可能档名当初用的是 gb2312 这类传统编码,所以对不起来。

关闭 ie 传送 utf-8 编码传送 url 即可解决。

--

论坛徽章:
0
6 [报告]
发表于 2007-02-24 00:30 |只看该作者
原帖由 kenduest 于 2007-2-23 23:38 发表


因为你的 ie 传送的是 utf-8 编码的 url request,但是你的 linux 本身可能档名当初用的是 gb2312 这类传统编码,所以对不起来。

关闭 ie 传送 utf-8 编码传送 url 即可解决。

--


谢谢。我想给出 URL 的时候应该直接提供编码后的地址串,用以避免这样的问题。(尽量不要让用户做额外的设置)

论坛徽章:
0
7 [报告]
发表于 2007-02-24 03:19 |只看该作者
原帖由 langue 于 2007-2-24 00:30 发表
谢谢。我想给出 URL 的时候应该直接提供编码后的地址串,用以避免这样的问题。(尽量不要让用户做额外的设置)


这个比较困难。

比方浏览 "http://hostname/测试网页.html",那浏览器发现 "测试网页.html" 本身是 8bit 的字元字串,所以发送出 url 请求时会转成 7bit 的编码后送出。重点是 ie 预设组态配置会把 "测试网页.html" 这个字串转成 utf-8 编码格式,然后转成 7bit 编码后送出。

因为 web server 收到 http request 后,其实只会针对 url 那串进行解码,所以上面情况来说最后会有两种结果,那就是:

1. "测试网页.html" 字串内容,该内容字集编码可能是 GB2312 or BIG5 等这类编码... or

2. "测试网页.html" 字串内容,该内容字集编码是 UTF-8 编码

然后 apache 把 "测试网页.html" 应对到磁碟的 filesystem 找相符的档案,那就要看 linux 本身档案系统对于当初档案储存时档名是使用哪种字集编码的。而这个就会引发不同相关的结果。

--

论坛徽章:
0
8 [报告]
发表于 2007-02-24 08:48 |只看该作者
原帖由 kenduest 于 2007-2-24 03:19 发表


这个比较困难。

比方浏览 "http://hostname/测试网页.html",那浏览器发现 "测试网页.html" 本身是 8bit 的字元字串,所以发送出 url 请求时会转成 7bit 的编码后送出。重点是 ie 预设 ...


我试过,你的说法可能适合很久以前的apache,现在的情况正好相反,现在的apache(2.0/2.2)只接受UTF8编码的url,双字节的那种是GB编码,不管是 2.0,还是2.2,都不接受,难道是传说中的 "纠枉过正"

现在能搜索到的大都是老版本的,建议取消IE "总是以UTF-8发送URL"的那种说法,仅有几个提出了改 Firefox的配置项 "network.standard-url.encode-utf8" 的

还有种方法就是加模块,在apache处理url前,把它们处理成通用的utf-8,此法甚好,可惜暂时不会

论坛徽章:
0
9 [报告]
发表于 2007-02-26 03:09 |只看该作者
原帖由 Namelessxp 于 2007-2-24 08:48 发表
我试过,你的说法可能适合很久以前的apache,现在的情况正好相反,现在的apache(2.0/2.2)只接受UTF8编码的url,双字节的那种是GB编码,不管是 2.0,还是2.2,都不接受,难道是传说中的 "纠枉过正"


有趣的问题。

apache 不会设计只接受 UTF-8 编码的 url,不过这个最好细节要谈到 apache 于 UNIX and WINDOWS 上平台对于档名解析上是否有设计解析差异。

现在能搜索到的大都是老版本的,建议取消IE "总是以UTF-8发送URL"的那种说法,仅有几个提出了改 Firefox的配置项 "network.standard-url.encode-utf8" 的


这个要明确聊聊。

若是 IE 预设开启使用 UTF-8 编码后导致 "无法存取 web server 的中文档名" 时,作法就是使用 "取消使用 UTF-8 传送" 选项即可解决。而 Firefox 预设本来就是关闭所以才可以存取到。而你说配置 "network.standard-url.encode-utf8" 更奇怪,若真的要改也要改成 false 才可以。

而假设 IE 开启使用 UTF-8 编码后 "才可以存取 web server 的中文档名" 时,,那 firefox 配置 "network.standard-url.encode-utf8" 才会是你所说改成 true 才对。

还有种方法就是加模块,在apache处理url前,把它们处理成通用的utf-8,此法甚好,可惜暂时不会


请把问题拉回来看,依据我前面回应:

web server 收到 http request 后,其实只会针对 url 那串进行解码,所以上面情况来说最后会有两种结果,那就是:

1. "测试网页.html" 字串内容,该内容字集编码可能是 GB2312 or BIG5 等这类编码... or

2. "测试网页.html" 字串内容,该内容字集编码是 UTF-8 编码


就 linux 系统架设 web server 来说,上面这些请求时 apache 会把 "测试网页.html" 应对到磁碟的 filesystem 找相符的档案,那就要看 linux 本身档案系统对于当初档案储存时档名是使用哪种字集编码的。而这个就会引发不同相关的结果。

主要重点是确认该 linux 本身 filesystem 储存该文档到底名称是不是 utf-8 encoding 这类,这个才能够决定 web-browser 这边到底要不是配置使用 UTF-8 传送 URL 功能项目。

那目前 web server 若是 windows 的话,那 windows 2000 or xp 这类系统本身 filesystem 一定为 unicode 编码储存档名。继续看一下 apache 2.0 release note:


  1. Native Windows NT Unicode Support
  2.     Apache 2.0 on Windows NT now uses utf-8 for all filename encodings. These directly translate to the underlying Unicode file system, providing multilanguage support for all Windows NT-based installations, including Windows 2000 and Windows XP. This support does not extend to Windows 95, 98 or ME, which continue to use the machine's local codepage for filesystem access.
复制代码


那结论是 windows 2k 等系统上跑 apache,底层档名存取都是走 unicode,所以浏览器那端的确要把含中文 url 编码为 UTF-8 后才可以正常存取。而预设 firefox 不会把 URL 编码成为 UTF-8 项目,所以浏览下面这类 URL 的确会出问题。

  1. http://hostname/测试网页.html"
复制代码


不过 windows apache 本身有改过一些架构,有趣的在于若是浏览一个可以显示目录结构内中文档名清单项目时,"测试网页.html" 会呈现如下连结格式:

  1. http://hostname/%e6%b8%ac%e8%a9%a6%e7%b6%b2%e9%a0%81.html
复制代码


后面那段 7bit urlencoding 项目,解码后就是 utf-8 编码的 "测试网页.html" 字串。

那这个问题讨论到最后,其实要依据对方的平台情况 ( unix 下还要考虑 filesystem 本身档名使用的 encoding charset 项目 )来决定浏览端的配置是否要选 utf-8 传送 url 项目。

更清楚一点说:

1. 安装 apache 2.0 等版本于 windows 2k、xp 这类支援 unicode 环境上时,浏览器那边要设定使用 UTF-8 编码传送 URL 。

2. 安装 apache 2.0 等版本于 unix,浏览器那边是否要设定使用 UTF-8 编码传送 URL ,得依据该 web server 的档名是否使用 UTF-8 编码。大部分传统一般 UNIX 还不流行使用 UTF-8 编码储存档名,比方使用 zh_CN.GB2312 等为工作环境项目,所以一般传送 UTF-8 编码一般都要关闭.

--

[ 本帖最后由 kenduest 于 2007-2-26 03:21 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP