Назад | Перейти на главную страницу

Как настроить веб-сайт с несколькими поддоменами, но с одним каноническим доменом

Я хочу обслуживать веб-сайт через https://the.example.com (таким образом, с нестандартным поддоменом), но тот же веб-сайт также должен быть введен с https://example.com и https://www.example.com (+ http аналоги).

Итак, если вы наберете https://www.example.com/page вы должны быть перенаправлены на https://the.example.com/page, и если вы наберете http://example.com/page вы должны быть перенаправлены на ту же страницу.

Я сделал это сейчас с nginx для http как это:

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

и этот блок для нестандартных https URL:

server {
    listen 443 ssl http2;
    server_name www.example.com example.com;

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

    location / {
        return 301 https://the.example.com$request_uri;
    }
}

и этот блок для актуального (канонического) сайта:

server {
    listen 443 ssl http2;
    server_name the.example.com;

    location ...
}

Я опустил большинство строк для краткости. Мне нужен только один редирект, прежде чем вы попадете на настоящий сайт.

В http-сайт и канонический https-сайт работает, но у меня проблемы с сертификатом https://www.example.com и https://example.com.

Я запросил три сертификата, вот так:

certbot certonly --webroot -w "/some/root" -d www.example.com -m user@examp.e.com --agree-tos
certbot certonly --webroot -w "/some/root" -d example.com -m user@examp.e.com --agree-tos
certbot certonly --webroot -w "/some/root" -d the.example.com -m user@examp.e.com --agree-tos

Как это должно работать? Если у подсайтов есть свои webroot, или должен быть общий доступ к корневому каталогу и / или сертификату? Я немного запутался в том, что происходит ...

вам нужно иметь отдельные конфигурации для доменов: www.example.com и example.com

server {
    listen 443 ssl http2;
    server_name www.example.com;
    
    ssl_certificate     www.example.com.crt;
    ssl_certificate_key www.example.com.key;

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

    location / {
        return 301 https://the.example.com$request_uri;
    }
}
server {
    listen 443 ssl http2;
    server_name example.com;
    
    ssl_certificate     example.com.crt;
    ssl_certificate_key example.com.key;

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

    location / {
        return 301 https://the.example.com$request_uri;
    }
}

с вашей конфигурацией

Я запросил три сертификата, вот так:

certbot certonly --webroot -w "/some/root" -d www.example.com -m user@examp.e.com --agree-tos

certbot certonly --webroot -w "/some/root" -d example.com -m user@examp.e.com --agree-tos

certbot certonly --webroot -w "/some/root" -d the.example.com -m user@examp.e.com --agree-tos

каждая конфигурация домена должна указывать на свой собственный файл сертификата и ключ

если сертификат не является подстановочным знаком *example.com

Вы можете использовать одну и ту же конфигурацию сервера для нескольких поддоменов, а также для основного домена. Однако вы ДОЛЖНЫ иметь .well-known/acme-challenge на порт 80 без SSL:

# The canonical site: we want this in our addressbar
server {
    listen       443 ssl http2;
    server_name  husker.example.com;  

    ssl_certificate         /etc/letsencrypt/live/husker.example.com/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/husker.example.com/privkey.pem;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

server {
    listen       443 ssl http2;
    server_name  www.example.com  secure.example.com  example.com;

    # same certificates, different server because of redirect
    ssl_certificate         /etc/letsencrypt/live/husker.example.com/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/husker.example.com/privkey.pem;

    # This redirects everything else to the canonical address
    location / {
        return 301 https://husker.example.com$request_uri;
    }
}

server {
    listen       80;
    server_name  husker.example.com;
    server_name  www.example.com  secure.example.com  example.com;

    # Allow anyone to view the acme-challenge; certbot needs this
    location /.well-known/acme-challenge {
        allow all;
        root /var/www/certbot/;
    }

    # This redirects everything else to the canonical address
    location / {
        return 301 https://husker.example.com$request_uri;
    }
}

Когда вы запрашиваете сертификат, вы должны поместить все свои домены в одну строку:

certbot certonly --webroot -w "/some/root" -d example.com -d www.example.com -d secure.example.com -m user@examp.e.com --agree-tos

Это создаст один сертификат с первым доменом, указанным в качестве субъекта, в этом случае example.com, а затем добавьте остальные домены как SubjectAlternativeName.