NGINX는 하위 도메인과 일반 도메인을 모두 지원합니다.

NGINX는 하위 도메인과 일반 도메인을 모두 지원합니다.

NGINX 전문가는 아니지만 효과가 있을 것으로 생각되는 변경 작업을 수행했습니다. 이것은 PROD 서버이므로 단지 여기에 밀어붙이고 최선을 다하고 싶지는 않습니다.

내가 하려는 것은 하위 도메인과 도메인을 모두 해당 페이지로 리디렉션하는 것입니다. 예를 들어 누군가가 들어왔을 때https://example.com나는 그것을 하기 위해 필요하다https://example.com누군가 들어갈 때https://learning.example.com가려면 그게 필요해https://learning.example.com그리고 마지막으로 누군가 들어오면https://www.learning.example.com리디렉션할 서버가 필요해요https://learning.example.com. 그게 다 말이 된다면.

아래 코드는 작동해야 한다고 생각하지만(틀릴 수도 있음) 누군가가 이를 검토하고 발생할 수 있는 잠재적인 문제를 해결할 수 있다면 감사하겠습니다.

server {
        listen 80;
        listen [::]:80;
        server_name *.example.com;

        location ~ /.well-known/acme-challenge {
                allow all;
                root /var/www/html;
        }

        location / {
                return ^ https://$host$request_uri? permanent;
        }
}

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

        server_tokens off;

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

        ssl_buffer_size 8k;

        ssl_dhparam /etc/ssl/certs/dhparam-2048.pem;

        ssl_protocols TLSv1.3 TLSv1.2;
        ssl_prefer_server_ciphers on;

        ssl_ciphers ECDH+AESGCM:ECDH+AES8:DH+3DES:!ADH:!AECDH:!MD5;

        ssl_ecdh_curve secp384r1;
        ssl_session_tickets off;

        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.8.8;

        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name *.example.com;
        server_tokens off;

        gzip on;
        gzip_disable "MSIE [1-6]\.(?!.*SV1)";
        gzip_min_length  500;
        gzip_buffers  4 32k;
        gzip_types  text/plain text/css application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml image/svg;
        gzip_vary on;

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

        ssl_buffer_size 8k;

        ssl_dhparam /etc/ssl/certs/dhparam-2048.pem;

        ssl_protocols TLSv1.3 TLSv1.2;
        ssl_prefer_server_ciphers on;

        ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

        ssl_ecdh_curve secp384r1;
        ssl_session_tickets off;

        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.8.8;

        location ~*  \.(jpg|jpeg|png|gif|ico)$ {
                expires 365d;
        }

        location / {
                try_files $uri @nodejs;
        }

        location @nodejs {
                proxy_pass http://nodejs:8080;
                add_header X-Frame-Options "SAMEORIGIN" always;
                add_header X-XSS-Protection "1; mode=block" always;
                add_header X-Content-Type-Options "nosniff" always;
                add_header Referrer-Policy "no-referrer-when-downgrade" always;
                add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
                # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
                # enable strict transport security only if you understand the implications
        }

        location /graphql {
                proxy_pass http://nodejs:8080;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $host;
        }

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

답변1

두 번째 블록에 오류가 있습니다 server.

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

$host이 경우 로 확인됩니다 server_name. 이는 리디렉션 루프가 발생함을 의미합니다.

접두사 에서 접두사 없이 호스트로 리디렉션하려면 www.다음에서 정규식을 사용해야 합니다 server_name.

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name ~^www\.(?<domain>.+)$;

    ...
    return 301 https://$domain$request_uri;
}

정규식은 기본 도메인 이름을 캡처한 다음 실제 도메인으로 리디렉션하는 데 사용됩니다.

관련 정보