Как я могу исправить проблемы с символами URL в AltoRouter PHP? - PullRequest
0 голосов
/ 02 июня 2019

У меня проблема с роутером.

Эта страница работает:

$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 голосов
/ 03 июня 2019

Это происходит из-за того, что веб-браузеры кодируют много символов, отличных от ascii, в URL-адресах, прежде чем они будут отправлены / запрошены.Я собираюсь слишком упростить многие вещи в своем ответе, поскольку кодирование - сложная вещь, но вкратце, даже если ваша адресная строка может показывать:

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, Эта страница MDN на encodeURI является хорошей отправной точкой.Чтобы узнать, чем в действительности является закодированный URI, проверьте панель сетевых запросов Chrome, распечатайте ее на PHP с print_r($_SERVER['REQUEST_URI']); или откройте консоль Chrome и запустите encodeURI('example.com/ğşçİ');.

...