У меня есть сертификат на example.com
и www.example.com
и следующий конфиг:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
Я пытаюсь перенаправить на www.example.com
и это работает, когда я навещаю https://example.com
. Меня успешно перенаправили. Но я не понимаю, почему это работает. Перенаправление 301 должно происходить через SSL, но я не указывал сертификат. Как это могло работать?
Кроме того, какой способ рекомендуется сделать? Просто добавить сертификат в блок выше?
Да, вам нужен сертификат для сайта https: // для перенаправления на https: // www сайт. В общем, самый простой способ - получить сертификат, охватывающий как www, так и не www, и использовать его в обеих конфигурациях сервера. Let's Encrypt делает это без проблем.
Почему ваша конфигурация работает?
Я понятия не имею, почему ваша конфигурация выше работает без указанного сертификата. Насколько я знаю, не должно.
Я поместил вашу конфигурацию в свой экземпляр Nginx на AWS, слегка изменив его следующим образом
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name example2.com;
return 301 https://www.example2.com$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name www.example2.com;
root /var/www/folder;
}
Я добавил следующее в свой / etc / hosts
11.0.1.10 example2.com www.example2.com
Когда я сделал wget, это то, что я получил
wget https://www.example2.com
--2017-07-29 08:07:17-- https://www.example2.com/
Resolving www.example2.com (www.example2.com)... 11.0.1.10
Connecting to www.example2.com (www.example2.com)|11.0.1.10|:443... connected.
Unable to establish SSL connection.
Вы можете видеть, что он может подключиться к серверу, но не может установить соединение SSL. Когда я использую curl, я получаю другой ответ, но это не работает.
curl https://www.example2.com
curl: (35) Encountered end of file
Исходя из этого, я думаю, что чего-то не хватает в том, что вы нам рассказали.
Вот как должно быть
Это показывает, как следует настроить Nginx.
# Main website, https www
server {
server_name www.example.com;
listen 443 ssl http2; # http2 is optional
ssl_certificate /path/to/fullchain;
ssl_certificate_key /path/to/privkey;
# locations etc
}
# forward https non-www to www
server {
server_name example.com;
listen 443 ssl;
ssl_certificate /path/to/fullchain;
ssl_certificate_key /path/to/privkey;
return 301 https://www.example.com$request_uri;
}
# Forward http to https
server {
listen 80;
server_name example.com www.example.com;
access_log /var/log/nginx/access.log main buffer=128k flush=1m if=$log_ua;
return 301 https://example.com$request_uri;
}