nginx try_files para reescrever .html em url “limpo”

5

Aqui está o diretório que contém arquivos html estáticos

public
|-- index.html
|-- media
|   '-- blurred_image-8.jpg
|-- post
|   '-- 13considerations
|       '-- index.html

Eu estou tentando configurar o nginx para converter todos os URLs que terminam com .html para remover o sufixo.

Assim: -

server {
    listen       80;
    server_name  mysite.com;

    location / {
        root   /var/www/mysite/public;
        try_files  $uri  $uri/ $uri/index.html;
    }

    location /media/ {
        alias /var/www/mysite/public/media/;
        error_page 404 = /404;
        expires 30d;
    }

    location /static/ {
        alias /var/www/mysite/public/static/;
        error_page 404 = /404;
        expires 30d;
    }
}

Isso funciona corretamente para a página inicial " link ", mas se eu tentar acessar " link ", recebo um erro interno de 500 servidores.

O que dá?

    
por Calvin Cheng 20.11.2013 / 10:35

1 resposta

13

O exemplo que você está usando funciona para retornar o conteúdo do arquivo index.html de um diretório, mas não funcionará para arquivos (por exemplo, http://server/somedir/file não retornará o conteúdo de /somedir/file.html ).

Uma configuração simplificada, que retornará qualquer arquivo HTML sem sua extensão e , usará index.html para diretórios da seguinte forma:

server {
    listen       80;
    server_name  mysite.com;

    index index.html;
    root /var/www/mysite/public;

    location / { 
        try_files $uri $uri/ @htmlext;
    }   

    location ~ \.html$ {
        try_files $uri =404;
    }   

    location @htmlext {
        rewrite ^(.*)$ $1.html last;
    }   
}

Como funciona:

  • Especificar index index.html será o padrão para usar esse arquivo quando os URIs de diretório forem acessados.
  • Colocar root fora do bloco location será aplicado em todo o servidor.
  • try_files $uri $uri/ @htmlext procurará uma correspondência exata para um arquivo ou diretório antes de finalmente tentar anexar .html .
  • try_files $uri =404 é para evitar que o Nginx fique preso em um loop de reescrita se não for possível encontrar um arquivo.
  • rewrite ^(.*)$ $1.html last acrescenta .html e reinicia o processo de correspondência de URI.
por 20.11.2013 / 11:01

Tags