【发布时间】:2011-02-24 08:43:17
【问题描述】:
我看到了validating utf-8 in htaccess rewrite rule 的帖子,我认为这很好,但我首先遇到了一个更根本的问题:
我需要扩展以处理查询字符串参数、目录名、文件名以及用于向用户显示等的 utf-8 字符。
我用 DefaultCharset utf-8 和我的 php 配置了我的 Apache,如果这很重要的话。我最初的重写规则过滤了除常规 A-Za-z 以及下划线和连字符之外的所有内容。它奏效了。其他任何东西都会给你一个 404 (这就是我想要的!)现在,但是似乎一切都匹配,包括我不想要的东西,但是,尽管它似乎匹配它不会进入查询字符串,除非它是一个常规的 A-Za-z_- 字符串。
我觉得这很混乱,因为规则说将匹配到的任何内容放入查询字符串中:
这是原来的规则:
RewriteRule ^/puzzle/([A-Za-z_-]+)$ /puzzle.php?g=$1 [NC]
这是修改后的规则:
RewriteRule ^/puzzle/(\w+)$ /puzzle.php?g=$1 [NC]
我进行了更改,因为在某处我读到 \w 与 A-Zetc 中的所有 alpha 字符匹配。只匹配那些没有口音和东西的。
我使用哪些规则似乎并不重要:会发生什么:
在应用程序中我有这个:
echo $_GET['g'];
如果我给它提供一个像http://mydomain.com/puzzle/USA 这样的网址,它会回显“美国”并且工作正常。
如果我给它提供一个像http://mydomain.com/puzzle/México 这样的网址,它不会对此做出任何回应,并警告我索引 g 没有定义,当然也没有获得墨西哥的资源。
如果我给它提供一个像http://mydomain.com/puzzle/fuzzle/buzzle/j.qle 这样的网址,它会做同样的事情。
最后一种情况应该是404!
无论我使用上述哪种规则,它都会这样做。我配置了一个重写日志
RewriteLogLevel 5
RewriteLog /opt/local/apache2/logs/puzzles.httpd.rewrite
但它是空的。
这是来自常规访问日志(它给出的状态为 200)
[26/May/2010:11:21:42 -0700] "GET /puzzle/M%C3%A9xico HTTP/1.1" 200 342
[26/May/2010:11:21:54 -0700] "GET /puzzle/M/l.foo HTTP/1.1" 200 342
我该怎么做才能让这些 $%#$@(*#@!!! 字符而不是斜线、点或其他非 alpha 字符进入我的程序,并且一旦出现,它会正确解码它们吗??? posix char 类工作得更好吗?我还需要配置什么吗?
【问题讨论】:
-
如果我在 serverfault 上交叉发布此内容,会不会令人不悦?它可能是也可能不是服务器问题。我把它放在这里是因为通常人们在这里回答得更快。
-
为了有资格获得赏金,解决方案必须是干净的,在 Mac Win 和 *ix 服务器上同样有效,并且实际解决了这个问题。同时,我正忙于涉及符号链接的解决方法,因为我在这方面浪费了太多时间。
标签: php apache mod-rewrite utf-8