
Ich brauche mein Nginx-Setup, um Benutzer auf www.example.com umzuleiten, wenn sie example.com in den Browser eingeben. Der Grund dafür ist, dass unser SEO-Berater sagte, es sollte nur eine bevorzugte Domain geben, da Google dies sonst als Inhaltsduplizierung betrachtet. Wie auch immer …
Der Punkt ist, dass ich auch SSL von Letsencrypt auf dem Server eingerichtet habe, aber ich kann die Umleitung von example.com zu www.example.com nicht erreichen (der Server akzeptiert beide Versionen). Hier ist die Konfiguration, die ich verwende:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
server_name example.com www.example.com;
root /home/my_site;
index index.php index.html index.htm;
# for letsencrypt
location ~ /.well-known {
allow all;
}
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
==== Aktualisieren ====
Ich habe jetzt meine Konfiguration wie von Tim in einer der Antworten auf Folgendes empfohlen geändert (und ich verwende immer nginx -t
und ):restart
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.example.com;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
root /home/ankush/wp_ankushthakur;
index index.php index.html index.htm;
# for letsencrypt
location ~ /.well-known {
allow all;
}
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
Hier sind die Ausgaben curl -k
und Zugriffsprotokolle für alle Varianten (ich habe Nginx nicht aus dem Quellcode erstellt, da ich auf eine einfachere Lösung hoffe und den Server nicht durcheinanderbringen möchte):
curl -k http://example.com
Curl output: 301 - Moved permanently
Access logs: "GET / HTTP/1.1" 301 194 "-" "curl/7.47.0"
curl -k http://www.example.com
Curl output: 301 - Moved permanently
Access logs: "GET / HTTP/1.1" 301 194 "-" "curl/7.47.0"
curl -k https://example.com
Curl output: 301 - Moved permanently
Access logs: "GET / HTTP/1.1" 301 194 "-" "curl/7.47.0"
curl -k https://www.example.com
Curl output: <Blank>
Access logs: "GET / HTTP/1.1" 301 5 "-" "curl/7.47.0"
Beachten Sie den letzten Abschnitt, in dem die CURL-Ausgabe leer ist und die Zugriffsprotokolle dennoch eine permanente Umleitung angeben.
Lustigerweise erreiche ich das Gegenteil von dem, was ich wollte, wenn ich den zweiten Block auskommentiere server
und dann Nginx neu starte: WWW wird auf Nicht-WWW umgeleitet! Ich bin überrascht, dass das passiert, denn die HTTPS-Version von www.example.com wird in dieser (dritten) Version der Konfiguration nirgends erwähnt.
Antwort1
Das liegt wahrscheinlich daran, dass Sie nur über HTTP, nicht aber über HTTPS umleiten. Sie sollten Ihrem umleitenden virtuellen Host ein HTTPS hinzufügen und dort nur example.com
den Namen stehen lassen.
Darüber hinaus ist das, was Sie tun, das Gegenteil von dem, was die Menschen heutzutage tatsächlich tun - der übliche Ansatz besteht darin, das Erbe zu begrabenwwwPräfixe aus der alten Ära und verwenden nur einfache Domänennamen, ohne diewww.
Antwort2
Der Schlüssel hier ist, dass Sie mit vier URLs umgehen müssen - http- und https-Versionen der www- und nicht-www-Domänen. Ihr Problem ist, dass Sie die http-Version der www- und nicht-www-Domäne an diehttps://wwwDomäne, aber Ihr Hauptserverblock lauscht auf beidehttps://example.comUndhttps://www.example.com
Alles was Sie tun müssen, ist einen separaten Serverblock zu erstellen, um diehttps://example.comzumhttps://www.example.comServer. Darin müssen Sie das https-Setup einbinden.
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
server_name www.example.com;
# Main server block for main server continues
}
Standardbeispiel
Ich habeein Tutorialmit herunterladbaren Konfigurationsdateien. Ein Standardbeispiel finden Sie unten.
Wenn dies bei Ihnen nicht funktioniert, curlen Sie jede Variante (http und https, www und nicht-www) mit der Option -k, um Header anzuzeigen, und bearbeiten Sie Ihre Frage, um sie einzuschließen.
# Main server
server {
server_name www.example.com;
listen 443 ssl http2;
# etc, add all locations, call PHP or servers, etc
}
# Forward http requests to https www server
server {
listen 80;
server_name example.com www.example.com;
return 301 https://www.example.com$request_uri;
}
# Forward https non-www requests to the https www server
# Requires https setup for this server
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /var/lib/acme/certs/***CERT_DIRECTORY/fullchain;
ssl_certificate_key /var/lib/acme/certs/***CERT_DIRECTORY/privkey;
# Set up preferred protocols and ciphers. TLS1.2 is required for HTTP/2
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
return 301 https://www.example.com$request_uri;
}
Probleme lösen Die besten Möglichkeiten zur Diagnose von Problemen sind:
- Verwenden Sie „curl -k“ (Header anzeigen) für jede der Domänenvarianten in Verbindung mit dem Zugriffsprotokoll. Die zurückgegebenen HTTP-Statuscodes sagen Ihnen, was los ist. 200 ist die Seite, 301 ist eine permanente Umleitung, 302 ist eine temporäre Umleitung
- Stellen Sie sicher, dass Nginx über das Modul headers_more verfügt. Dies können Sie tun, indem SieNginx aus dem Quellcode erstellen, was ganz einfach ist. Damit können Sie der Antwort https-Header hinzufügen. Dies ist ein großartiges Diagnosetool. Mit Anweisungen wie dieser können Sie herausfinden, welche Blöcke ausgeführt werden
add_header Z_DEBUG "Standortname_oder_Nachricht";
Antwort3
Ich konnte unseren SEO-Mitarbeiter schließlich davon überzeugen, die Nicht-www-Domäne als primäre Domäne zu betrachten. Die Konfiguration, mit der die Umleitung von www auf Nicht-www funktionierte, war wie folgt. Obwohl mein Versuch, das Gegenteil zu erreichen, eine ähnliche Konfiguration hatte, bin ich mir nicht sicher, was dies verhinderte.
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
server_name example.com;
root /home/mysite;
index index.php;
location ~ /.well-known {
allow all;
}
location / {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
try_files $uri $uri/ /index.php?$query_string;
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
}
}