Это происходит из-за того, что веб-браузеры кодируют много символов, отличных от 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/ğşçİ');
.