包含某些中文字符的url会忽略.htaccess里的rewrite规则导致404
最近出现了奇怪的问题 大部分中文地址都没有问题 但是某些中文文件会跳过rewrite规则直接访问从而出现404经过我反复的验证发现 这些url出现问题的共同特征就是这个汉字被自动urlencode后带“%85”
如“全”字编码后是%e5%85%a8 “入”字的编码是%e5%85%a5“公”字的编码是%e5%85%ac
在config.php里把所有中文加入 $config['permitted_uri_chars'] 也解决不了问题 经过查询0085在unicode字码表里代表换行 不知道是不是这个导致的问题出现
Hex 发表于 2017-2-8 12:25
是的,你可以参考这个 http://httpd.apache.org/docs/current/mod/mod_rewrite.html 手册。
安全的“安”字:
mod_rewrite.c(477): 192.168.1.9 - - add path info postfix: D:/xampp/htdocs/attachment -> D:/xampp/htdocs/attachment/download/\xe5\xae\x89
mod_rewrite.c(477): 192.168.1.9 - - strip per-dir prefix: D:/xampp/htdocs/attachment/download/\xe5\xae\x89 -> attachment/download/\xe5\xae\x89
mod_rewrite.c(477): 192.168.1.9 - - applying pattern '^(.*)$' to uri 'attachment/download/\xe5\xae\x89'
mod_rewrite.c(477): 192.168.1.9 - - rewrite 'attachment/download/\xe5\xae\x89' -> 'index.php?/attachment/download/\xe5\xae\x89'
mod_rewrite.c(477): 192.168.1.9 - - split uri=index.php?/attachment/download/\xe5\xae\x89 -> uri=index.php, args=/attachment/download/\xe5\xae\x89
mod_rewrite.c(477): 192.168.1.9 - - add per-dir prefix: index.php -> D:/xampp/htdocs/index.php
mod_rewrite.c(477): 192.168.1.9 - - trying to replace prefix D:/xampp/htdocs/ with /
mod_rewrite.c(477): 192.168.1.9 - - internal redirect with /index.php
mod_rewrite.c(477): 192.168.1.9 - - strip per-dir prefix: D:/xampp/htdocs/index.php -> index.php
mod_rewrite.c(477): 192.168.1.9 - - applying pattern '^(.*)$' to uri 'index.php'
mod_rewrite.c(477): 192.168.1.9 - - pass through D:/xampp/htdocs/index.php
安全的“全”字:
mod_rewrite.c(477): 192.168.1.9 - - add path info postfix: D:/xampp/htdocs/attachment -> D:/xampp/htdocs/attachment/download/\xe5\x85\xa8
mod_rewrite.c(477): 192.168.1.9 - - strip per-dir prefix: D:/xampp/htdocs/attachment/download/\xe5\x85\xa8 -> attachment/download/\xe5\x85\xa8
mod_rewrite.c(477): 192.168.1.9 - - applying pattern '^(.*)$' to uri 'attachment/download/\xe5\x85\xa8'
mod_rewrite.c(477): 192.168.1.9 - - pass through D:/xampp/htdocs/attachment
本帖最后由 stalkerru 于 2017-2-7 16:50 编辑
Hex 发表于 2017-2-7 15:21
%85 这就是普通的 urlencode,一般来说一个中文的 utf-8 编码是 %e5 开头的三个字节,所以你的那个编码看 ...
服务器环境是Windows/Apache2.4 .htaccess的内容是这样的
RewriteEngine onRewriteBase /
RewriteCond $1 !^(favicon\.ico|index\.html|index\.php|static|robots\.txt)
RewriteRule ^(.*)$ index.php?/$1
比如 http://localhost/download/index/安生产规范 就可以正确转向到 http://localhost/index.php?/download/index/%e5%ae%89%e7%94%9f%e4%ba%a7%e8%a7%84%e8%8c%83
而 http://localhost/download/index/安全生产规范 就会在apache里生成一条 http://localhost/download/index/%e5%ae%89%e5%85%a8%e7%94%9f%e4%ba%a7%e8%a7%84%e8%8c%83404 not found的错误日志就差一个字
不要在 URI 中使用中文,把中文放到参数中就可以避免这个问题了。中文比较特殊,能不用就不要用。 我现在很无奈地用base64对中文进行编码后传递了 但还是很想知道这是什么原因导致的
stalkerru 发表于 2017-2-7 14:02
我现在很无奈地用base64对中文进行编码后传递了 但还是很想知道这是什么原因导致的
...
%85 这就是普通的 urlencode,一般来说一个中文的 utf-8 编码是 %e5 开头的三个字节,所以你的那个编码看起来是没问题的。
而 rewrite 这个是服务器的功能,跟 PHP 是没有关系的,所以要看 404 是谁抛出的 404,这个需要你提供更多信息来确认。 stalkerru 发表于 2017-2-7 16:40
服务器环境是Windows/Apache2.4 .htaccess的内容是这样的
404 页面截图看一下。 Hex 发表于 2017-2-7 17:19
404 页面截图看一下。
stalkerru 发表于 2017-2-7 18:05
你那里能打开 url rewrite log 吗?这个看起来是 rewrite 的问题,貌似是某些中文会不经过 rewrite 处理。
要解决问题,可以尝试用 urlencode() 处理中文以后再拼到 URL 中,不要用 base64 Hex 发表于 2017-2-7 19:42
你那里能打开 url rewrite log 吗?这个看起来是 rewrite 的问题,貌似是某些中文会不经过 rewrite 处理 ...
url rewrite的log怎么打开?在apache的httpd.conf里吗
页:
[1]
2