Eu uso reescrever no meu servidor nginx para permitir que URLs como https://www.example.com/en/product/apple.html
passem en
, product
e apple.html
para um único script PHP assim:
rewrite ^/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-]+)/(.+)$ /index.php?lang=$1&page=$2&part=$3&$query_string last;
Como você pode ver, a terceira parte, neste caso apple.html
, corresponderia a qualquer caractere. Quando esta parte contém caracteres especiais codificados em URL, o nginx parece estar decodificando-os rapidamente, o PHP não seria capaz de detectar se o usuário entrou com o caractere codificado na URL ou decodificado. Por exemplo: /en/product/apples,oranges.html
e /en/product/apples%2Coranges.html
, o PHP leria apples,oranges.html
em ambos os casos.
Para não ter 2 URLs com o mesmo conteúdo: o nginx pode reescrever o URL sem decodificar caracteres especiais / reservados codificados em URL para que o PHP possa determinar se deve redirecionar para o URL não codificado? Ou, melhor ainda, pode ser configurado para redirecionar 301 /en/product/apples%2Coranges.html
para /en/product/apples,oranges.html
?
PS. Sei que a URL melhor seria /en/product/apples-oranges.html
e esqueça a vírgula. Mas como a Web nos permite formar URLs com caracteres especiais, como vírgula, estou interessado em aprender como lidar com eles.