Итак, я наконец-то нашёл время, чтобы изучить руководства «Настройка Let’s Encrypt для нескольких доменов» и «Перенаправление одного или нескольких доменов на ваш экземпляр Discourse».
В мой файл containers/app.yml я добавил гораздо больше настроек, чем вы, и почти всё работает корректно.
Мой Discourse размещён на поддомене www, и моей целью было перенаправление запросов http и https с корневой зоны домена на поддомен www. Это теперь работает, но если я перехожу по адресу https://mydomain.com, происходит перенаправление, однако в консоли Chrome появляется следующее предупреждение:
Redirecting navigation example.com -> www.example.com because the server presented a certificate valid for www.example.com but not for example.com. To disable such redirects launch Chrome with the following flag: --disable-features=SSLCommonNameMismatchHandling
Вот мои дополнения к app.yml:
after_ssl:
- replace:
filename: "/etc/runit/1.d/letsencrypt"
from: /--keylength/
to: "-d example.com -d www.example.com --keylength"
- replace:
filename: "/etc/nginx/conf.d/discourse.conf"
from: /return 301 https.+/
to: |
return 301 https://$host$request_uri;
- replace:
filename: "/etc/nginx/conf.d/discourse.conf"
from: /gzip on;[^\}]+\}/m
to: |
gzip on;
add_header Strict-Transport-Security 'max-age=31536000'; # remember the certificate for a year and automatically connect to HTTPS for this domain
after_web_config:
- replace:
filename: /etc/nginx/nginx.conf
from: /sendfile.+on;/
to: |
server_names_hash_bucket_size 64;
sendfile on;
- file:
path: /etc/nginx/conf.d/discourse_redirect_1.conf
contents: |
server {
listen 80;
listen 443 ssl;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
Выглядит ли это правильно? Если да, то есть ли решение проблемы несоответствия имени сертификата?
РЕДАКТИРОВАНИЕ: У меня есть две записи A: одна для поддомена www, а другая с использованием @ для перехвата всех запросов к корневой зоне домена. Обе указывают на IP-адрес моего сервера Digital Ocean. Предполагаю, что это тоже верно?
Бесплатно в реализации, даже если Cloudflare не является вашим регистратором. Работает с HTTPS, без дополнительных сложностей в вашей установке Discourse.
Спасибо, я сейчас не использую Cloudflare, поэтому раньше с этим не сталкивался. Я пошёл другим путём и следовал инструкциям выше, в основном удалось решить мою проблему. Вы опубликовали сообщение как раз в тот момент, когда я отправил свой ответ выше.
Пожалуйста, проверьте этот веб-сайт: есть ли там все необходимые вам редиректы? Это реализовано всего одним блоком replace (см. выше) и следующей настройкой DNS (я скрыл только TXT-записи с email):
Изменение, внесённое 9 сентября прошлого года, нарушило подход, которому вы следовали, и поскольку реализация выходила за рамки стандартной установки, решение было опубликовано только 31 октября. Если вы посмотрите на тему, которой вы следовали, и историю правок в вики, это чётко задокументировано.
Поскольку вы не занимаетесь чем-то, что требует глубокого погружения в дополнительную конфигурацию, я бы не рекомендовал этого делать. С другой стороны, когда Let’s Encrypt действительно внесёт изменения, и вы затронете их, мы сможем направить вас обратно к этой теме.