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.