nginx regra de reescrita para substituir terminações .php com /

1

Basicamente, eu quero que o ".php" seja substituído por um "/". Eu tentei apenas colocar minha regra no mesmo local onde o fastcgi está localizado.

location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi_params;
                rewrite ^(.+)\.php$ /$1;
}

No entanto, quando eu reinicio o nginx com essas configurações, ele me dá um Erro Interno do Servidor 500 e não consigo nem mesmo fazer com que o servidor me mostre nada. Isso é por causa do cgi rápido? Como posso contornar isso?

Meu sistema: nginx / php5-fpm / apc / php5-memcache / Ubuntu 10.10

    
por Frank Vilea 23.08.2011 / 17:03

1 resposta

3

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.

    
por 23.08.2011 / 19:22