我看到帖子了验证 htaccess 重写规则中的 utf-8 https://stackoverflow.com/questions/2565864/validating-utf-8-in-htaccess-rewrite-rule我认为这很好,但我首先遇到一个更根本的问题:
我需要扩展以处理查询字符串参数、目录名称、文件以及用于向用户显示等的 utf-8 字符。
我用 DefaultCharset utf-8 配置了我的 Apache,如果重要的话也配置了我的 php。我最初的重写规则过滤了除常规 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 等所有字母字符匹配。只匹配那些没有重音符号之类的东西。
我使用哪一个规则似乎并不重要:以下是发生的情况:
在应用程序中我有这个:
echo $_GET['g'];
如果我给它一个像这样的网址http://mydomain.com/puzzle/USA http://mydomain.com/puzzle/USA它回响“美国”并且工作正常。
如果我给它一个像这样的网址http://mydomain.com/puzzle/México http://mydomain.com/puzzle/M%C3%A9xico它对此没有任何回应,并警告我索引 g 未定义,当然也没有获得墨西哥的资源。
如果我给它一个像这样的网址http://mydomain.com/puzzle/fuzzle/buzzle/j.qle 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 类会吗工作好一点了吗?我还需要配置什么吗?