Я использую перезапись на моем сервере 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-адреса со специальными символами, такими как запятая, мне интересно узнать, как с ними работать.