[Bug]Apache mod_rewrite处理中文字符存在的bug

learningman 7月 25, 2018

起因

使用开源项目oneindex自建网盘,发现一些文件夹无法访问,而且路径不一定中文
目前确认的重现关键词为「小鸟游六花」。

查看服务器上Apache的access.log,浏览器发送了正确的Request,以UTF-8编码
随后确认错误是mod_rewrite处理中文时的问题,服务器在把url发送给php处理之前就返回了404,也许和使用了php-cgi有关系
使用的是Apache2.4,运行在Windows Server 2008 R2,php以fast-cgi模式工作

分析

来自https://blog.csdn.net/questionfish/article/details/78266123

问题描述

Url中有Unicode编码包含有“\x85”的汉字字节(即encode后包含“%85”的汉字, 如:“关”、 “兲“、 “共“、 “兰“、 “儰”、 “䅰”、 “腰” 等),并且不是作为查询参数时,无法正常使用。

问题分析

可能是因为“\x85”字节在Unicode中为控制字符“Next Line”,干扰正则表达式中“$”的识别。

解决方法

URL中尽量不要包含汉字,必须出现汉字时尽量作为查询参数使用。
- 重写规则改为RewriteRule ^(.*) index.php/$1 [QSA,PT,L]
- 删除正则表达式中的“$”,放行到服务器端编程后处理(权宜之计,不推荐)。

其他方案

一个由日本人写的模块mod_encoding可能能解决此问题,但是其Win32版本仅支持到Apache2.0.53,似乎有人成功的在Linux版的Apache2.4上编译安装了此模块,可以尝试

本文采用 CC BY-NC-SA 3.0 协议进行许可,在您遵循此协议的情况下,可以自由共享与演绎本文章。
本文链接:https://learningman.top/archives/674.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注




you're currently offline