Nginx: перенаправление на www через https [дубликат]

Этот вопрос является точной копией следующего:

I Я пытаюсь перенаправить https://domain.ltd на https://www.domain.ltd на Nginx (обратите внимание на www), вот конфигурация:

server {
    listen 80;
    server_name domain.ltd;
    return 301 https://www.$host$request_uri;
}
server {
    listen 443;
    server_name domain.ltd;
    return 301 https://www.$host$request_uri;
}
server {
    listen 443 ssl;
    server_name www.domain.ltd domain.ltd;
    ...main config goes here
}

Что мне показалось странным, так это то, что все остальные параметры работают нормально:

http://domain.ltd перенаправляет на https://www.domain.ltd

http: //www.domain .ltd перенаправляет на https://www.domain.ltd

https://www.domain.ltd тоже работает

Но никак для https: // domain.ltd , отображается только ERR_CONNECTION_REFUSED .

В чем проблема с конфигурацией? Как решить?

UPD. У меня есть и www.domain.ltd, и domain.ltd, включенные в мой сертификат SSL, поэтому нет причин не работать

-1
задан 23 July 2017 в 20:40
2 ответа

Вы допустили ряд ошибок

  • Не прослушивает SSL
  • Не указаны ключи и сертификаты SSL
  • Указание домена в двух серверных блоках
  • Отсутствие косой черты

Если вы не знаете о SSL, попробуйте прочитать мое руководство Nginx / SSL , которое поможет вам получить бесплатный SSL-сертификат Let's Encrypt.

Вот конфигурация, которую можно попробовать

server {
  listen 80;
  server_name domain.ltd;
  return 301 https://www.domain.ltd/$request_uri;
}
server {
  listen 443 ssl;
  server_name domain.ltd;
  ssl_certificate ....; # Insert certificate references
  ssl_certificate_key ...; # Insert certificate key references
  return 301 https://www.domain.ltd/$request_uri;
}
server {
  listen 443 ssl;
  server_name www.domain.ltd;
  ssl_certificate ....; # Insert certificate references
  ssl_certificate_key ...; # Insert certificate key references
  ...main config goes here
}
1
ответ дан 5 December 2019 в 19:12

Вы должны включить ssl.

SSL - это протокол, HTTP - другой протокол. На стороне сервера номер порта не будет явно указывать протоколы. Вы можете запустить любой из них на любых портах. С другой стороны, браузеры неявно пытаются установить связь, используя http на порту 80 и https (ssl) на 443.

Естественно, если две стороны говорят на разных языках, возникает ошибка связи.

Неважно, хотите ли вы просто перенаправить что-то, открыв веб-сокет или получить веб-страницу, вы должны соответствовать ожиданиям браузера ИЛИ явно указать, что вы хотите.

Вы можете сказать http://some.site.com:443/ , чтобы заставить клиент (браузер) использовать неявный протокол (http без 's' на 443), который, скорее всего, работать с вашей текущей конфигурацией. Но правильно здесь не вводить пользователей в заблуждение и всегда включать ssl (и все навороты) при использовании порта 443.

2
ответ дан 5 December 2019 в 19:12

Теги

Похожие вопросы