Nginx reescreve tendo precedência sobre redirecionamentos?

1

Eu tenho alguns redirecionamentos configurados em um arquivo de inclusão para a configuração do nginx. Eu notei no outro dia que alguns redirecionamentos não estão funcionando, e eles parecem ser apenas aqueles que são afetados por regras de reescrita.

Alguém pode dar uma olhada e ver o que eu fiz de errado? Aqui estão os trechos relevantes:

/etc/nginx/sites-available/MySite.conf:

server {
    listen 443 ssl http2 default_server;
    server_name www.example.com ;
    include /etc/nginx/sites-available/includes/Redirects.conf;
    include /etc/nginx/sites-available/includes/Rewrites.conf;
    ...
}

/etc/nginx/sites-available/includes/Redirects.conf:

#This redirect works:
location ~ ^/images/products/1234.jpg { return 301 /images/products/5678.jpg$is_args$args ; }
#This redirect does NOT work
location ~ ^/p/1234 { return 301 /p/5678$is_args$args ; }

/etc/nginx/sites-available/includes/Rewrites.conf:

#This rewrites the short URL /p/<ProductCode> to our ecommerce system's default URL
#I think this is what is conflicting with the redirect above
rewrite ^/p/(.*) /mm5/merchant.mvc?Screen=PROD&Product_Code=$1 break;
    
por Mike Willis 25.10.2018 / 17:19

1 resposta

2

Pode não estar claro na documentação, mas rewrite diretivas no bloco server são avaliadas sequencialmente antes da pesquisa por location para processar o URI.

Portanto, a instrução " rewrite ^/p/(.*) ... " será avaliada antes da instrução " location ~ ^/p/1234 ... ", independentemente da ordem dessas duas declarações.

Você pode converter suas declarações rewrite em location blocks ou vice-versa.

Por exemplo:

rewrite ^/p/1234 /p/5678 permanent;
rewrite ^/p/(.*) /mm5/merchant.mvc?Screen=PROD&Product_Code=$1 break;
    
por 25.10.2018 / 18:36