O arquivo de índice redireciona no nginx

1

Cenário

Eu tenho um site com a seguinte estrutura:

/index.html
/about/index.html
/contact/index.php
/contact/send_email.php

Gostaria de deixar a URL mais limpa, então seria a estrutura equivalente com:

/ => /index.html
/about/ => /about/index.html
/contact/ => /contact/index.html
/contact/send_email.php => /contact/send_email.php

Basicamente, uma configuração Nginx que remove todos os nomes de arquivos index.html ou index.php do URI.

Minha tentativa de configuração

server {
    listen 80;
    root /home/www/mysite;
    server_name www.mysite.com;        

    location ^~* /[a-z]+/index\.(html|php)$ {
        rewrite ^(/[a-z]+/)index\.(html|php)$ http://www.mysite.com$1? permanent;
    }

    try_files $uri $uriindex.html $uriindex.php =404;

    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/run/php5.sock
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

O problema

Em resumo - não funciona. Quando eu for para /about/index.html ele deve redirecionar permanentemente para /about/ , mas ele permanece em /about/index.html . Eu testei as expressões regulares e elas parecem estar bem - ou seja, o grupo de captura definido nos trabalhos de reescrita.

    
por Hzmy 16.09.2013 / 23:07

1 resposta

1

Qual versão do nginx você está usando?

Eu tentei sua configuração com o nginx 1.4.2 e detectei alguns erros de sintaxe:

  1. invalid location modifier "^~*" na sua primeira diretiva location - alterei para ~
  2. unknown "uriindex" variable na sua diretiva try_files - alterei os dois $uriindex.html e $uriindex.php para $uri/index.html e $uri/index.php

Neste ponto, acredito que a configuração faz quase tudo que você deseja:

  1. Ir para www.mysite.com/about/index.html você está redirecionado para www.mysite.com/about/
  2. Ir para www.mysite.com/contact/index.html você está redirecionado para www.mysite.com/contact/
  3. Ir para www.mysite.com/contact/send_email.php nenhum redirecionamento ocorre

Agora, para que www.mysite.com/index.html redirecione para www.mysite.com/ , você precisará de outra diretiva "location" e regra de reescrita:

location ~ /index\.html$ {
    rewrite ^/index\.html$ http://www.mysite.com permanent;
}

E quanto a www.mysite.com/contact/ a ser executado com PHP-FPM como www.mysite.com/contact/index.php script, você também precisará de uma diretiva de localização específica. A linha fastcgi_index index.php aqui é realmente importante:

location = /contact/ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass unix:/var/run/php5.sock
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Espero que isso ajude:)

    
por 17.09.2013 / 10:32