Re: Грамотный redirect

Maxim Dounin mdounin на mdounin.ru
Чт Авг 18 19:57:45 UTC 2016


Hello!

On Thu, Aug 18, 2016 at 03:40:11PM -0400, VVL wrote:

> Доброго времени суток. Знакомясь с nginx, была построена и некоторое время
> использовалась конструкция:
> server {
> listen *:80;
> listen *:443;
> server_name example.com www.example.com;
> if ($scheme = 'http') { return 301 https://$server_name$request_uri; }
> if ($host = 'www.example.com') { return 301 https://example.com$request_uri;
> }
> ...
> }
> которая одновременно перенаправляет весь трафик на https, а так же
> производит редирект на домен без www.
> Осматривая документацию и рекомендации экспертов, везде натыкаюсь на
> конструкцию вида (с теми же функциями):
> server {
> listen *:80;
> listen *:443;
> server_name www.example.com;
> return 301 https://example.com$request_uri;
> }
> server {
> listen *:80;
> server_name example.com;
> return 301 https://$server_name$request_uri;
> }
> server {
> listen *:443;
> server_name example.com;
> ...
> }
> и возникает ряд вопросов, почему же эта конструкция лучше первой? Ведь:
> 1. В предложенном конфиге при, например, переходе от https://www.example.com
> на https://example.com будет установлено два ssl/tls соединения

Их будет установлено два в любом случае.

(Точнее - HTTP/2 некоторые браузеры могут попытаться использовать 
для обоих запросов одно и то же соединение, но это никак не 
зависит от варианта конфигурации.)

> 2. Если используется req_limit (и любые другие тонкие настройки хоста), то
> его надо добавлять и в секцию, отвечающую за редирект.

В секции, отвечающей за редирект, обычно не нужны никакие 
настройки.  Например, limit_req там писать более или менее 
бессмысленно, т.к. стоимость обработки перенаправления - меньше, 
чем стоимость возврата ошибки о превышении лимита.

Основное примущество конфигурации с отдельными блоками server для 
перенаправлений - в первую очередь в том, что запросы, на которые 
нужно вернуть перенаправления, отделяются от реальных запросов на 
максимально раннем этапе.  В результате:

1. Конфгурация, в которой обрабатываются реальные запросы, не 
загромождена не относящимися к задаче проверками.

2. Обработка делается максимально эффективно, без дополнительных 
условных проверок, выполняемых для всех запросов.

-- 
Maxim Dounin
http://nginx.org/



Подробная информация о списке рассылки nginx-ru