понедельник, 16 мая 2011 г.

Глобальный 301 редирект на/с "www." версию домена в nginx

Для чего если можно просто указать все версии домена в server_name? Чтоб не слетали куки. А то авторизованный на example.com человек оказывается не авторизован на www.example.com куда его привела скажем ссылка из уведомления о новом ответе на форуме. Это очень раздражает.

Подчтеннейшая публика! Предлагаю Вам вариант универсального редиректа на все виртуальные серваки управляемые целевым nginx'ом.

В общем для мазохистов-любителей длинных имён и прочих эмо есть вариант редиректа с без "www" на "www":

server {
  server_name ~^(?!www\.);
  rewrite ^ http://www.$host$request_uri permanent;
}

да, почему-то принято упоминать, что автор решения Игорь Сысоев.

Для прочих же, кто не стремится нажимать лишние клавиши преобразование из "www" в без "www"

server {
  server_name ~^(?=www\.);
  if ( $host ~* "www.(.*)"){
    set $unwww $1;
  }
  rewrite ^ $scheme://$unwww$request_uri permanent;
}

Автор решения Ваш покорный слуга :)

ВНИМАНИЕ! Всё это дело вставляется в начало блока http файла nginx.conf и не забываем убирать в конфах виртуальных серваков из server_name вариант с/без "www" (убираем то, с чего редиректим), а то не сработает!