Рейтинг:0

Nginx — как заставить все серверные домены и серверные блоки использовать перенаправление без www?

флаг de

Есть много хороших результатов о том, как перенаправить «www» на «не-www» и наоборот.

Большинство рекомендуемое решение это:

сервер {
    слушать 80;
    имя_сервера www.example.com;
    вернуть 301 https://example.com$request_uri;
}

Это хорошо работает для одного файла конфигурации веб-сайта. Однако он быстро дублирует конфигурацию, когда у вас есть несколько веб-сайтов на одном сервере Nginx.

Мне бы очень хотелось избежать дублирования конфигурации службы, над которой я работаю...

Итак, мое предполагаемое решение для захвата всех доменов www.[anything.com] выглядит примерно так:

сервер {
    слушать 80;
    вернуть 301 https://$host$request_uri;
}

Тем не менее, я считаю, $хост переменная по-прежнему содержит «www» внутри (что имеет смысл).

Я изо всех сил пытаюсь проверить это с моей текущей конфигурацией, поэтому, чтобы сэкономить время, пожалуйста, может ли кто-нибудь с большим опытом работы с Nginx указать мне правильное направление после этого момента?

Спасибо за уделенное время!

Рейтинг:2
флаг us

Вы можете использовать следующий подход:

сервер {
    слушать 80;
    имя_сервера ~^(?:www\.)(.*)$;

    вернуть 301 https://$1$request_uri;
}

Регулярное выражение захватывает часть после www. к $1 переменная, которая затем используется в возвращаться утверждение.

https://nginx.org/r/имя_сервера объясняет более подробно, как nginx решает, какой сервер блокировать для использования.

Michael Hampton avatar
флаг cz
И не забудьте включить блок ssl `server` с соответствующими сертификатами.
Matthew Spence avatar
флаг de
Это очень сильное спасибо! Я отмечу это как правильный ответ на этот вопрос. Однако мне было бы любопытно, есть ли решение без регулярных выражений для повышения производительности?
флаг us
Нет, потому что вам нужно извлечь часть имени хоста, а регулярное выражение — единственный способ сделать это.
Рейтинг:0
флаг ar
сервер { 

         имя_сервера пример.com; 

         вернуть 301 https://www.example.com$request_uri; 

}

По умолчанию, если вы опустите эту директиву, nginx предполагает, что вы хотите прослушивать порт 80.

Здесь документация этого поведения по умолчанию.

Вот полная конфигурация для вашего default-ssl.conf

сервер {

 слушать 443 ssl;

 имя_сервера пример.com; 

ssl_certificate /srv/www/example.com/keys/ssl.crt; 

ssl_certificate_key /srv/www/example.com/keys/www.example.com.key; 

вернуть 301 https://www.example.com$request_uri; 

}

Вы можете заменить ssl на; директива listen 443 ssl; в качестве рекомендации от документация по нгинкс.

Matthew Spence avatar
флаг de
Спасибо за ваш ответ. К сожалению, это не помогает в создании универсального решения, поэтому вам не нужно писать конфигурацию для каждого домена (как если бы вы работали только с `example.com`, а не `example-2. ком`)
Рейтинг:0
флаг sv

Добро пожаловать в ServerFault.

Хотя то, что ответил Теро Килканен, является основной концепцией, лучше способ сделать то же самое уже предоставлен в официальной документации по адресу https://nginx.org/r/имя_сервера и в https://nginx.org/en/docs/http/server_names.html.

сервер {
    имя_сервера ~^www\.(?<baredomain>.+)$;
    вернуть 301 https://$baredomain$request_uri;
}

При этом используется метод под названием «Именованные захваты» при оценке регулярного выражения. «Именованные захваты» могут использовать любой из следующих синтаксисов...

?<имя> Синтаксис, совместимый с Perl 5.10, поддерживается, начиная с версии PCRE-7.0.
?'name' Синтаксис, совместимый с Perl 5.10, поддерживается начиная с PCRE-7.0.
?P<name> Синтаксис, совместимый с Python, поддерживается начиная с PCRE-4.0.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.