stalkerru 发表于 2017-2-6 02:03:01

包含某些中文字符的url会忽略.htaccess里的rewrite规则导致404

最近出现了奇怪的问题   大部分中文地址都没有问题    但是某些中文文件会跳过rewrite规则直接访问从而出现404

经过我反复的验证发现   这些url出现问题的共同特征就是这个汉字被自动urlencode后带“%85”

如“全”字编码后是%e5%85%a8   “入”字的编码是%e5%85%a5“公”字的编码是%e5%85%ac

在config.php里把所有中文加入 $config['permitted_uri_chars'] 也解决不了问题

stalkerru 发表于 2017-2-6 02:06:01

经过查询0085在unicode字码表里代表换行   不知道是不是这个导致的问题出现


stalkerru 发表于 2017-2-10 15:50:52

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:40:20

本帖最后由 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的错误日志就差一个字

Hex 发表于 2017-2-6 14:31:48

不要在 URI 中使用中文,把中文放到参数中就可以避免这个问题了。中文比较特殊,能不用就不要用。

stalkerru 发表于 2017-2-7 14:02:51

我现在很无奈地用base64对中文进行编码后传递了   但还是很想知道这是什么原因导致的

Hex 发表于 2017-2-7 15:21:31

stalkerru 发表于 2017-2-7 14:02
我现在很无奈地用base64对中文进行编码后传递了   但还是很想知道这是什么原因导致的
...

%85 这就是普通的 urlencode,一般来说一个中文的 utf-8 编码是 %e5 开头的三个字节,所以你的那个编码看起来是没问题的。

而 rewrite 这个是服务器的功能,跟 PHP 是没有关系的,所以要看 404 是谁抛出的 404,这个需要你提供更多信息来确认。

Hex 发表于 2017-2-7 17:19:54

stalkerru 发表于 2017-2-7 16:40
服务器环境是Windows/Apache2.4    .htaccess的内容是这样的




404 页面截图看一下。

stalkerru 发表于 2017-2-7 18:05:09

Hex 发表于 2017-2-7 17:19
404 页面截图看一下。





Hex 发表于 2017-2-7 19:42:24

stalkerru 发表于 2017-2-7 18:05


你那里能打开 url rewrite log 吗?这个看起来是 rewrite 的问题,貌似是某些中文会不经过 rewrite 处理。
要解决问题,可以尝试用 urlencode() 处理中文以后再拼到 URL 中,不要用 base64

stalkerru 发表于 2017-2-7 21:10:21

Hex 发表于 2017-2-7 19:42
你那里能打开 url rewrite log 吗?这个看起来是 rewrite 的问题,貌似是某些中文会不经过 rewrite 处理 ...

url rewrite的log怎么打开?在apache的httpd.conf里吗
页: [1] 2
查看完整版本: 包含某些中文字符的url会忽略.htaccess里的rewrite规则导致404