我的路由器有问题。
此页面正在工作:
$router->map('GET', '/home', function(){
global $vt,$title,$router;
echo "Working!";
exit();
},'main.view');
但是,当我不使用这样的拉丁字符时;
$router->map('GET', '/ğşçİ', function(){
global $vt,$title,$router;
echo "404 Not Found!";
exit();
},'main.view');
路由器转到404页。
如何解决此问题?我需要所有角色来工作。 (阿拉伯文,西里尔文,中国,土耳其文..)
答案 0 :(得分:0)
之所以发生这种情况,是因为Web浏览器在事件发送/请求之前在URL中编码了许多非ASCII字符。由于编码是很复杂的事情,因此我将在答案中简化很多内容,但是总之,即使您的地址栏可能显示:
example.com/ğşçİ
...实际上被请求的内容最终是:
example.com/%C4%9F%C5%9F%C3%A7%C4%B0
由于AltoRouter(默认情况下)在编码的 URI上进行比较,因此您的路由不匹配,因为ğşçİ !== %C4%9F%C5%9F%C3%A7%C4%B0
这里最简单的解决方案不是告诉编码的URI,而是告诉AltoRouter根据解码的URI比较您的路由。您将需要更改:
$match = $router->match();
收件人:
$match = $router->match(urldecode($_SERVER['REQUEST_URI']));
或者,如果您确实想在编码值上保留AltoRouter的默认匹配项,则可以通过对实际的匹配字符串进行编码来触发匹配,如下所示:
$router->map('GET','/'.rawurlencode('ğşçİ'), function(){
...
},'main.view');
PS:有关URI编码的更多详细信息,this MDN page on encodeURI是一个很好的起点。通过检查Chrome网络请求面板,使用print_r($_SERVER['REQUEST_URI']);
在PHP中进行打印,或者打开Chrome控制台并运行encodeURI('example.com/ğşçİ');
,可以查看实际编码的URI最终是什么。