如何解决PHP AltoRouter URL字符问题?

时间:2019-06-02 12:53:42

标签: php character router

我的路由器有问题。

此页面正在工作:

$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页。

如何解决此问题?我需要所有角色来工作。 (阿拉伯文,西里尔文,中国,土耳其文..)

1 个答案:

答案 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最终是什么。