Nginx - reescrever ou retornar para o redirecionamento?

18

Eu tenho duas opções (retorno e reescrita) para redirecionamento e não tenho certeza do que é recomendado para desempenho, SEO, etc.:

## Redirect from non-www to www
server {
        server_name example.com;
        # Option 1
        return 301 $scheme://$host$request_uri;

        # Option 2
        rewrite ^ http://$host$request_uri? permanent;
    }

## Default server config

server {
        ...
        listen      192.168.1.1:80 default_server;
        root        /www;
        server_name www.example.com;

A opção 2 parece funcionar com curl, mas não é redirecionada quando chamada por um navegador e o código de retorno é o de um redirecionamento temporário, apesar da diretiva de reescrita estar definida como permanent:

 curl -I example.com
 HTTP/1.1 302 Moved Temporarily
 Server: nginx
 ...
 Location: http://www.example.com/
 ...
HTF
fonte

Respostas:

17

Sua opção 1:

return 301 $scheme://$host$request_uri;

É exatamente o que você quer.

Não sei por que a rewrite ^ http://$host$request_uri? permanent;linha resultaria em 302 em vez de 301. Essa é a sintaxe apropriada para forçá-la a retornar um 301.

Gnarfoz
fonte
11
Eu tive que adicionar a diretiva "listen" ao primeiro bloco do servidor. Funciona bem, no entanto, quando tento acessar o administrador (Wordpress - wp-admin), há algum tipo de loop e não consigo acessar a página de login. Alguma ideia?
HTF
2
Provavelmente seria melhor lidar com isso em uma pergunta separada. Parece que tanto o seu software (wordpress) como o nginx estão redirecionando, resultando em um loop.
Gnarfoz
3

Tecnicamente, você pode usar as duas opções. Eles podem trabalhar.

De acordo com a documentação do NGINX , use returnse puder . É mais simples e rápido porque o NGINX para de processar a solicitação (e não precisa processar uma regex). Mais do que isso, você pode especificar um código na série 3xx :

return (301 | 302 | 303 | 307) url;

Se você tem um cenário em que precisa validar a URL com uma regex ou precisa capturar elementos na URL original (que obviamente não estão em uma variável NGINX correspondente), use-o rewrite. Você deve saber que rewriteretorna apenas o código 301 ou 302.

rewrite regex URL [flag];

Você pode ler mais sobre devolução e reescrita no site da NGINX.

Maxime
fonte