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类工作得更好?还有什么我需要配置的吗?
在...
RewriteRule ^/puzzle/(\w+)$ /puzzle.php?g=$1 [NC]
如果我错了,有人会纠正我,但这是否意味着请求子目录的请求会绕过此规则?
另外,解决此问题的一种懒惰方法是也将“%”字符分组。据我所知,您可以在任何 url 路径上使用的只是 url 编码。实际上,请参阅:http ://www.blooberry.com/indexdot/html/topics/urlencoding.htm
我确信有更先进、更好的方法可以做到这一点,但这应该可以解决您眼前的问题。