Назад | Перейти на главную страницу

Nginx - переписать или вернуть на перенаправление?

У меня есть два варианта перенаправления (возврат и перезапись), и я не уверен, какой из них рекомендуется для повышения производительности, SEO и т. Д.

## 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;

Вариант 2, похоже, работает с curl, но он не перенаправляет при вызове браузером, а код возврата - это код временного перенаправления, несмотря на то, что для директивы rewrite установлено значение permanent:

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

Ваш вариант 1:

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

Это именно то, что вам нужно.

Не уверен, почему rewrite ^ http://$host$request_uri? permanent; строка приведет к 302 вместо 301. Это правильный синтаксис, чтобы заставить его вернуть 301.

Технически можно использовать оба варианта. Они могут работать.

Согласно Документация NGINX, использовать return если вы можете. Это проще и быстрее, потому что NGINX перестает обрабатывать запрос (и ему не нужно обрабатывать регулярное выражение). Более того, вы можете указать код в 3xx серии:

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

Если у вас есть сценарий, в котором вам нужно проверить URL-адрес с помощью регулярного выражения или нужно захватить элементы в исходном URL-адресе (которые, очевидно, не находятся в соответствующей переменной NGINX), вам следует использовать rewrite. Вы должны это знать rewrite возвращает только код 301 или 302.

rewrite regex URL [flag];

Вы можете узнать больше о возвращение и переписать на сайте NGINX.