Nginx reescreve todos os arquivos html, exceto o índice

4

Estou tendo um pouco de dificuldade com o Nginx reescreve. Recentemente, mudei o blog para um novo mecanismo, e a estrutura da URL mudou. No meu antigo blog, as postagens do mecanismo estavam localizadas em uma URL com o formulário http://$host/yyyy/mm/title.html . No entanto, no novo mecanismo, elas têm o formato http://$host/yyyy/mm/title/ . O arquivo real que está sendo retornado pelo servidor reside em /yyyy/mm/title/index.html .

Para garantir que os links em postagens antigas ainda funcionem, quero fazer uma regravação no Nginx que se pareça com isso:

rewrite ^/(\d\d\d\d)/(\d\d)/(.+)\.html$ $scheme://$host/$1/$2/$3/ permanent;

Infelizmente, isso captura tudo o que termina com .html , incluindo index.html , portanto, visitar um URL do formulário /(\d\d\d\d/)/(\d\d)/(.+)/ causa um loop de redirecionamento (o nginx tenta internamente usar /$1/$2/$3/index.html , que redireciona para /$1/$2/$3/ , que redireciona de volta para index.html, etc.).

Eu prefiro não usar declarações se for possível. Alguma idéia?

Para referência, o site é estático e a configuração do meu servidor é parecida com essa (nada interessante aqui):

server {
  listen      [::]:80;
  server_name blog.samwhited.com;
  root /var/www/blog.samwhited.com;
  charset utf-8;
  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
  }
  error_page 404 /error/404.html;
  error_page 403 /error/403.html;
  location /error/ { internal; }
}

Veja um exemplo rápido do comportamento de redirecionamento esperado:

link - > link

Também seria ótimo se index.html pudesse estar oculto. Nada que eu encontrei online funcionou. Então, isso também funcionaria:

link - > link

    
por Sam Whited 30.07.2012 / 03:31

1 resposta

5

Você praticamente precisa usar uma instrução if , mas é perfeitamente seguro fazer isso se você tiver apenas rewrite diretivas dentro dela. Você deseja verificar a variável $uri , pois isso inclui modificações feitas pelo módulo index .

if ($uri !~ /index\.html$) {
    rewrite ^/test/(\d\d\d\d)/(\d\d)/(.+)\.html$ /$1/$2/$3/ permanent;
}

Para remover a parte index.html , você precisa enviar um redirecionamento, mas apenas se o cliente especificou index.html e não foi adicionado pelo módulo index . Isso significa que precisamos de outra instrução if para verificar isso. Usamos a variável $request_uri aqui, que é o que o cliente realmente enviou.

if ($request_uri ~ /index\.html($|\?)) {
    rewrite ^(.*)/index\.html$ $1/ permanent;
}
    
por 30.07.2012 / 04:58

Tags