NGINX: перенаправление на адрес без www

NGINX: перенаправление на адрес без www

Я пытаюсь настроить свой сайт с помощью NGINX. Я немного не в себе и перепробовал все подходящие решения, которые смог найти, поэтому ваше терпение будет оценено по достоинству :)

Я хочу, чтобы весь http-трафик перенаправлялся на https, а соединения с www-поддоменом моего сайта и с IP-адресом моего сервера (123.123.123.123 для наших целей) перенаправлялись на mywebsite.com. Конфигурация моего сервера приведена ниже, и она соответствует всем этим критериям, за исключением www-редиректа, который выдает мне страницу NGINX 404. Я не понимаю, что обработка IP-адреса и www-поддомена, как мне кажется, идентична — проблема в чем-то другом, например, в сертификатах DNS или SSL? Спасибо.

/etc/nginx/sites-available/мойвебсайт

server {
        listen 80 ;
        server_name www.mywebsite.com mywebsite.com 123.123.123.123 ;
        return 301 https://mywebsite.com$request_uri ;
}
server {
        server_name www.mywebsite.com ;
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    return 301 https://mywebsite.com$request_uri ;


}
server {
        server_name 123.123.123.123;
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    return 301 https://mywebsite.com$request_uri ;


}
server {
        server_name mywebsite.com ;
        root /var/www/mywebsite ;
        index index.html index.htm index.nginx-debian.html ;
        location / {
                try_files $uri $uri/ =404 ;
        }
        if ($host != mywebsite.com) {
                return 301 https://mywebsite.com$request_uri;
        } 


    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


}
root@localhost:~# certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: mail.mywebsite.com
    Serial Number: ###################################
    Key Type: ECDSA
    Domains: mail.mywebsite.com
    Expiry Date: 2023-12-09 16:27:55+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/mail.mywebsite.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/mail.mywebsite.com/privkey.pem
  Certificate Name: mywebsite.com
    Serial Number: ###################################
    Key Type: ECDSA
    Domains: mywebsite.com mail.mywebsite.com www.mywebsite.com
    Expiry Date: 2023-12-09 03:09:48+00:00 (VALID: 88 days)
    Certificate Path: /etc/letsencrypt/live/mywebsite.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/mywebsite.com/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Что касается DNS, у меня есть записи A и AAAA для mywebsite.com и *.mywebsite.com, указывающие на адреса ipv4 и ipv6 моего сервера соответственно, а также запись MX и несколько записей TXT для моего почтового поддомена.

A   mywebsite.com   123.123.123.123 600     
A   *.mywebsite.com 123.123.123.123 600     
AAAA    mywebsite.com   1234:1234::1234:1234:1234:1234  600     
AAAA    *.mywebsite.com 1234:1234::1234:1234:1234:1234  600     
MX  mywebsite.com   mail.mywebsite.com  600 10  
TXT _dmarc.mywebsite.com    v=DMARC1; p=reject; rua=mailto:[email protected]; fo=1    600     
TXT mywebsite.com   v=spf1 mx a:mail.mywebsite.com -all 600     
TXT mail._domainkey.mywebsite.com   v=DKIM1; h=sha256; k=rsa; p=#####################################   600 

решение1

(в основном это комментарии, но место ограничено)

Я хочу, чтобы весь http-трафик перенаправлялся на https,

Хорошо, кажется разумным.

и соединения с www-поддоменом моего веб-сайта и с IP-адресом моего сервера (123.123.123.123 для наших целей) должны перенаправляться на mywebsite.com

Почему? Я не вижу в этом никакой выгоды, и это фактически закрывает дверь для любой высокой доступности сервиса.

Да, беглый осмотр конфигурации предполагает, что он должен делать то, что вы думаете. Однако почему вы используете разные серверные блоки для описанияwww.mywebsite.comи 123.123.123.123, когда они реализуют одно и то же поведение? (На самом деле вы могли бы реализовать поведение для 3 SSL vhosts в одном блоке сервера). Аналогично вам не нужен отдельный сертификат для mail.mywebsite.com.

Проблема с сертификатом вряд ли приведет к ошибке 404.

DNS кажется очевидным для проверки / наоборот, вы можете явно переопределить любой существующий DNS и увидеть фактические заголовки HTTP, используя (например):

curl -I -k --resolve \*:443:123.123.123 https://www.example.com

Связанный контент