Concluir as diretivas de reescrita de processamento na localização e retornar 301

1

Eu tenho o seguinte no meu nginx.conf:

location ~* /collections.*?products/([^/]+)/?$ {
    rewrite ^/collections.*?products/([^/]+)/?$ /$1.html;
    rewrite ^([^_]*)_([^_]*)_(.*)$ $1-$2-$3;
    rewrite ^([^_]*)_(.*)$ $1-$2 permanent; 
}  

Para reescrever solicitações como

"/collections/products/someproduct/" to "/someproduct.html"
"/collections/products/some_product/" to "/some-product.html"
"/collections/products/some_other_product/" to "/some-other-product.html"

No entanto, só consigo que um redirecionamento 301 ocorra se a última diretiva de reconfiguração (contendo o permanent flag) corresponder e processar, por exemplo, meu segundo exemplo. Nas outras duas instâncias, recebo um redirecionamento temporário 302. Como posso processar essas várias diretivas de reconfiguração neste bloco de localização e retornar o redirecionamento 301, independentemente de quais delas correspondem? Se eu colocar um sinalizador permanente em todas as diretivas de reescrita, ele irá parar o processamento após a primeira partida.

    
por Nick Rolando 14.12.2017 / 06:58

2 respostas

1

Você pode converter _ para - recursivamente e independentemente do rewrite...permanent .

Por exemplo:

location ~* /collections.*?products/([^/]+)/?$ {
    rewrite ^(.*)_(.*)$ $1-$2 last;
    rewrite ^/collections.*?products/([^/]+)/?$ /$1.html permanent; 
}

O segundo rewrite é executado somente após o primeiro rewrite não encontrar mais sublinhados. Consulte este documento para saber mais.

    
por 14.12.2017 / 11:42
0

Você pode tratar o código de status 302 como uma "exceção" e "capturá-lo" com o link .

location ~* /collections.*?products/([^/]+)/?$ {
    rewrite ^/collections.*?products/([^/]+)/?$ /$1.html;
    rewrite ^([^_]*)_([^_]*)_(.*)$ $1-$2-$3;
    rewrite ^([^_]*)_(.*)$ $1-$2 permanent;
    error_page 302 =301 @302to301;
}
location @302to301 {
    return 300; # 300 is just a filler here, error_page dictates status code
    #return 301 $sent_http_location;
}

A técnica é semelhante ao meu 301-302-redirect-w-no-http-body-text.nginx.conf , conforme uma questão relacionada na produção de redirecionamentos 301/302 sem HTTP Response Body .

Note que dentro de @302to301 , você tem uma escolha entre duas declarações de retorno acima; no entanto, o código return é irrelevante no contexto desse manipulador, pois a diretiva error_page acima garante que todos os códigos 302 sejam alterados para 301 , independentemente de qual seja o código subsequente.

Em outras palavras, a única diferença entre as duas declarações return acima será o conteúdo do Corpo de Resposta HTTP, que nenhum navegador mostra para 301 respostas, portanto, você também pode usar o corpo mais curto. menos return 300 versão.

    
por 14.12.2017 / 22:56