使用utf-8字符和apache2重写规则的麻烦

Col*_*ick 11 php apache mod-rewrite utf-8

我看到帖子验证了htaccess重写规则中的utf-8,我认为这很好,但是我首先遇到的一个更基本的问题:

我需要扩展以处理查询字符串参数的utf-8字符,目录,文件的名称,以及用户在显示中使用的等.

我使用DefaultCharset utf-8配置我的Apache,如果重要的话还配置了我的php.我的原始重写规则过滤了除常规A-Za-z和下划线和连字符之外的所有内容.它起作用了.任何其他东西都会给你一个404(这就是我想要的!)现在,然而,似乎一切都匹配,包括我不想要的东西,但是,虽然它似乎匹配它不会进入查询字符串,除非它是一个常规的A-Za-z_-字符串.

我发现这令人困惑,因为规则说把你匹配的任何东西放到查询字符串中:

这是原始规则:

RewriteRule ^/puzzle/([A-Za-z_-]+)$ /puzzle.php?g=$1 [NC]
Run Code Online (Sandbox Code Playgroud)

这是修订后的规则:

RewriteRule ^/puzzle/(\w+)$ /puzzle.php?g=$1 [NC]
Run Code Online (Sandbox Code Playgroud)

我做了改变,因为在某处我读到了\ w匹配所有的alpha字符,其中A-Zetc.只匹配没有重音和东西的那些.

我使用哪些规则似乎并不重要:这是发生的事情:

在应用程序中我有这个:

echo $_GET['g'];
Run Code Online (Sandbox Code Playgroud)

如果我给它提供一个像http://mydomain.com/puzzle/USA这样的网址 它会回复"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
Run Code Online (Sandbox Code Playgroud)

但它是空的.

这是来自常规访问日志(它给出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
Run Code Online (Sandbox Code Playgroud)

我可以做些什么来获得这些$%#$ @(*#@ !!!字符但不是斜线,点或其他非alpha到我的程序中,一旦那里,它会正确解码它们吗?将posix char类工作得更好?还有什么我需要配置的吗?

bob*_*yer 1

在...

RewriteRule ^/puzzle/(\w+)$ /puzzle.php?g=$1 [NC]

如果我错了,有人会纠正我,但这是否意味着请求子目录的请求会绕过此规则?

另外,解决此问题的一种懒惰方法是也将“%”字符分组。据我所知,您可以在任何 url 路径上使用的只是 url 编码。实际上,请参阅:http ://www.blooberry.com/indexdot/html/topics/urlencoding.htm

我确信有更先进、更好的方法可以做到这一点,但这应该可以解决您眼前的问题。