Как исправить http-перенаправления с помощью Nginx?

У меня есть веб-страница, где http-перенаправления немного нарушены.

текущее поведение таково:

www.example.com, example.com,http://www.example.com, http://example.com, https://www.example.com все перенаправляется на https://www.example.com

и

https://example.com получает сообщение об ошибке отказано в подключении.

Я хочу, чтобы поведение быть таким:

example.com,http://example.com, https://example.com перенаправляет на https://example.com

www.example.com,http://www.example.com, https://www.example.com перенаправляет на https://www.example.com

вот мой конфигурационный файл Nginx

server {
       listen 80 default_server;
       listen [::]:80 default_server;
       server_name example.com www.example.com;
       return 301 https://$server_name$request_uri;
}

server {
        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;
        include snippets/ssl-example.com.conf;
        include snippets/ssl-params.conf;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location ~ /.well-known {
                allow all;
        }

        location / {
                try_files $uri $uri/ =404;
        }
}

причина в том, что я хочу, чтобы эти ссылки работа

https://www.ssllabs.com/ssltest/analyze.html?d=example.com

https://www.ssllabs.com/ssltest/analyze.html?d=www.example.com

https://hstspreload.org/?domain=example.com

https://hstspreload.org/?domain=www.example.com

2 ответов


у вас есть два независимых вопроса:


  1. все ваши запросы перенаправляются на example.com, независимо от того, какой конкретный домен изначально обращались.

это происходит потому, что $server_name переменная, которую вы используете, фактически является статической переменной в данном server контексте, и имеет очень отдаленное отношение к $http_host.

правильным способом было бы использовать $host вместо этого (что в основном $http_host С некоторыми очистками edge-corner).


  1. вы получаете проблемы с подключением при попытке связаться https://example.com, но не https://www.example.com.

в вашем вопросе недостаточно информации, чтобы точно определить происхождение этой проблемы.

это может быть проблема DNS (A/AAAA отчеты example.com установить на IP-адрес, где соответствующие привязки к https порт не производится).

это может быть проблема с несоответствием сертификата:

  • Ваш сертификат охватывает оба example.com и www.example.com? Если нет, то вы не можете иметь и то, и другое.

  • если у вас есть отдельные сертификаты, вам также может потребоваться приобрести отдельные IP-адреса или риск предотвращения доступа значительного числа пользователей к вашему сайту из-за отсутствия SNI.


как Примечание, следует также отметить, что это, как правило, небрежная практика, чтобы не иметь единой нотации на пути доступа к вашему сайту. Особенно, если SEO имеет какое-либо отношение к вам, лучшая практика-решить, хотите ли вы пойти с или без www, и придерживайтесь его.


вам нужно что-то вроде этого:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name www.example.com;

    include snippets/ssl-example.com.conf;
    include snippets/ssl-params.conf;

    add_header Strict-Transport-Security "max-age=300; includeSubdomains; preload";

    return 301 https://www.example.com$request_uri;
}
server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name example.com;

    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    include snippets/ssl-example.com.conf;
    include snippets/ssl-params.conf;

    add_header Strict-Transport-Security "max-age=300; includeSubdomains; preload";

    location ~ /.well-known {
        allow all;
    }
    location / {
        try_files $uri $uri/ =404;
    }
}

все ваши запросы будут в конечном итоге направлены на https://example.com. Ваш SSL-сертификат также должен быть действителен дляhttps://www.example.com что, как я заметил, Вы сказали.