Назад | Перейти на главную страницу

перезапись nginx без декодирования URL

Я использую перезапись на моем сервере nginx, чтобы разрешить такие URL-адреса, как https://www.example.com/en/product/apple.html пройти en, product и apple.html в один скрипт PHP, например:

rewrite ^/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-]+)/(.+)$ /index.php?lang=$1&page=$2&part=$3&$query_string last;

Как видите, третья часть, в данном случае apple.html, будет соответствовать любым символам. Когда эта часть содержит специальные символы в кодировке URL, кажется, что nginx декодирует их на лету, PHP не сможет определить, ввел ли пользователь закодированный символ в URL или декодировал. Например: /en/product/apples,oranges.html и /en/product/apples%2Coranges.html, PHP будет читать apples,oranges.html в обоих случаях.

Чтобы не было двух URL-адресов с одинаковым содержимым: может ли nginx переписать URL-адрес без декодирования специальных / зарезервированных символов, закодированных в URL-адресе, чтобы PHP мог определить, следует ли перенаправлять на некодированный URL-адрес? Или, что еще лучше, можно настроить его на 301 редирект /en/product/apples%2Coranges.html к /en/product/apples,oranges.html?

PS. Я знаю, что лучший URL-адрес был бы /en/product/apples-oranges.html и забудьте про запятую. Но поскольку Интернет позволяет нам формировать URL-адреса со специальными символами, такими как запятая, мне интересно узнать, как с ними работать.