Essencialmente, o seu plano geral tem muitos problemas com isso. Primeiro, como você está removendo o .php, a reescrita deve estar fora de location ~ .php$
, já que o URL não terminará em .php até que após seja reescrito. Em segundo lugar, seu rewrite
está invertido. Você deseja que a URL http://www.example.com/foo/
execute foo.php
, portanto, a reescrita precisa ser
rewrite ^(.+)/ $1.php;
Mas isso significa que CADA diretório em seu site precisaria de um arquivo .php correspondente, pois você não poderá mais usar index.php automaticamente. Além disso, se o nginx não duplicar as barras antes de reescrever, se alguém digitar um endereço errado como http://www.example.com/foo//
, ele executará /foo/.php
.
Finalmente, quantos arquivos PHP você está planejando criar? Você realmente acha que serverfault tem um arquivo 304162.php para essa pergunta? (não que a URL dos serverfaults corresponda à sua reescrita, uma vez que ela não termina em /
, nem eles usam PHP, eu acho)
Normalmente, as URLs limpas funcionam declarando uma localização específica (por exemplo, /questions/
) e depois reescrevendo tudo DEPOIS que a URL seja executada por um único script:
rewrite ^/questions/(.*)$ /questions.php?path=$1 last;
Você também pode fazer algo como
rewrite ^/questions/([0-9]+)(/.*)?$ /questions.php?qid=$1&extra=$2 last;
Para que os URLs possam ser example.com/questions/1
example.com/questions/1/
example.com/questions/1/how-do-I-rewrite
, mas example.com/questions/banana
será rejeitado por não ter um ID de pergunta numérico.
Veja como as pessoas configuram URLs limpos para Drupal ou Wordpress . Essencialmente, cada pedido de um arquivo que não existe é reescrito como /index.php?q=$1
, onde index.php examina a variável "q" para descobrir o que é suposto fazer.