У меня два сайта на одном IP-адресе со следующей конфигурацией:
Я могу получить доступ к https://site2WithSSL.com и чтобы http://site1.com без проблемы. Проблема возникает, когда кто-то хочет получить доступ к https: //site1.com, nginx отвечает site2WithSSL.com Я хочу избежать этого. Я имею в виду, когда кто-то получает доступ к https: //site1.com не нужно возвращать контент или просто перенаправлять на https: //
Конфигурация такая:
server {
listen 80;
server_name *.site1.com;
// ...
}
server {
server_name www.site2WithSSL.com;
return 301 $scheme://site2WithSSL.com$request_uri;
}
server {
listen 80;
listen 443 ssl;
server_name site2WithSSL.com;
ssl_certificate site2WithSSL.crt;
ssl_certificate_key site2WithSSL.key;
// ...
}
РЕШЕНО: использование разных ip для каждого сайта
Ваша проблема в том, что SSL не поддерживает несколько хостов на одном IP.
Когда NGINX получает новое соединение через HTTP / 1.1, запрос включает заголовок HOST, который указывает, какой виртуальный хост будет обслуживать (это было большим изменением в версии 1.1, и позволяет использовать виртуальные хосты в том виде, в каком мы их знаем сегодня).
Но с HTTPS заголовки зашифрованы, и перед их расшифровкой необходимо установить обмен ключами и уровень TLS. Другими словами, у nginx нет возможности выбрать правильный блок SSL-сервера до тех пор, пока он не отправит сертификат SSL.
Вы можете добавить перенаправление, соответствующее доменному имени site1, в конфигурации site2, но пользователь все равно получит сообщение о том, что сертификат недействителен, так что это не очень приемлемо.
Есть несколько многодоменных сертификатов, которые вы можете использовать, хотя это будет стоить вам.
Самый простой и, возможно, лучший вариант для вашей желаемой конфигурации - использовать разные IP-адреса для каждого сайта. Различные конфигурации сервера NGINX могут привязываться к разным адресам, поэтому никогда не возникает вопросов, какой из них какой. Большинство провайдеров могут предоставить вам несколько IP-адресов, некоторые даже несколько блоков, и, конечно же, в облаке вы можете просто выделить больше.
update: SNI решает эту проблему, перемещая заголовок Host за пределы зашифрованной полезной нагрузки и поддерживается современными браузерами.
Невозможно прослушивать порт 443 на том же IP-адресе только для одного сайта, потому что он знает, какой сайт хочет получить клиент, только из SSL Client Hello. После того, как он получил Hello, у него есть возможность либо завершить квитирование SSL, либо разорвать соединение. В первом случае вам необходимо предоставить сертификат, во втором случае клиент получит некоторую бесполезную ошибку о разорванном SSL-соединении.
В итоге все сводится к следующим вариантам:
Только последний вариант будет работать на клиенте без ошибок.
Я думал о конфигурации для site1.com прослушивания порта 443 без ssl, который перенаправляет только на http://site1.com. Я думаю, он должен работать без необходимости нового IP-адреса.