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