Ich bin kein NGINX-Guru, aber ich habe die Änderungen vorgenommen, von denen ich glaube, dass sie funktionieren werden. Dies ist ein PROD-Server, also möchte ich nicht einfach darauf pushen und auf das Beste hoffen.
Ich versuche, sowohl Subdomains als auch Domains auf die entsprechenden Seiten umzuleiten. Wenn jemand beispielsweisehttps://example.comIch muss es tun, umhttps://example.comwenn jemand eintritthttps://learning.example.comIch brauche es, um zu gehenhttps://learning.example.comund schließlich, wenn jemand eintritthttps://www.learning.example.comich brauche einen Server zum Weiterleitenhttps://learning.example.com. Wenn das alles Sinn macht.
Ich bin der Meinung, dass der folgende Code funktionieren sollte (könnte aber falsch sein), wäre aber dankbar, wenn ihn jemand überprüfen und mögliche Probleme beheben könnte, die er verursachen könnte.
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;
}
Antwort1
server
In Ihrem zweiten Block liegt ein Fehler vor .
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.example.com;
...
return 301 https://$host$request_uri;
}
$host
würde in diesem Fall zu aufgelöst server_name
, was bedeutet, dass eine Umleitungsschleife entsteht.
Um von einem Präfix zu einem Host ohne Präfix umzuleiten www.
, müssen Sie einen regulären Ausdruck in folgendem Feld verwenden server_name
:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ~^www\.(?<domain>.+)$;
...
return 301 https://$domain$request_uri;
}
Der reguläre Ausdruck wird verwendet, um den bloßen Domänennamen zu erfassen und dann die Weiterleitung an die tatsächliche Domäne auszugeben.