Frage Umleiten von nicht www zu www über SSL mit Nginx


Ich habe einen Fehler beim Versuch, umzuleiten https://example.com zu https://www.beispiel.com.

Wenn ich gehe https://example.comEs leitet den Seiten- / 200-Status nicht um und gibt ihn zurück.

Ich will das nicht, ich möchte es umleiten https://www.beispiel.com.

Wenn ich gehe http://example.com, es leitet weiter zu https://www.beispiel.com

Kann mir jemand sagen, wo ich falsch liege?

Dies sind meine Standard und Standard-ssl Konfigurationsdateien:

default.conf

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

Standard-ssl.conf

upstream app_server_ssl {
    server unix:/tmp/unicorn.sock fail_timeout=0;
}

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

    listen 443;
    root /home/app/myproject/current/public;
    index index.html index.htm;

    error_log /srv/www/example.com/logs/error.log info;
    access_log /srv/www/example.com/logs/access.log combined;

    ssl on;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_certificate /srv/www/example.com/keys/ssl.crt;
    ssl_certificate_key /srv/www/example.com/keys/www.example.com.key;
    ssl_ciphers AES128-SHA:RC4-MD5:ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:RSA+3DES:!ADH:!AECDH:!MD5:AES128-SHA;
    ssl_prefer_server_ciphers on;

    client_max_body_size 20M;


    try_files $uri/index.html $uri.html $uri @app;


    # CVE-2013-2028 http://mailman.nginx.org/pipermail/nginx-announce/2013/000112.html
    if ($http_transfer_encoding ~* chunked) {
            return 444;
        }

    location @app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://app_server_ssl;
    }

    error_page 500 502 503 504 /500.html;

    location = /500.html {
        root /home/app/example/current/public;
    }
}

21
2017-08-28 23:11


Ursprung


Was ist der Zweck der Erstellung von 2 Conf-Dateien? - Sandip Subedi
Trennung von Bedenken, die SSL-Konfiguration war so klein, dass es am besten schien, sie von der SSL-Konfiguration zu trennen. - Thomas V.


Antworten:


Du fehlst listen Direktive in Datei default-ssl.conf. Hinzufügen listen 443; in dieser Richtlinie

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

Wenn Sie diese Anweisung weglassen, gehen Sie davon aus, dass nginx standardmäßig auf Port 80 wartet. Hier die Dokumentation dieses Standardverhaltens.


Edit: Danke für den Kommentar von @TeroKilkanen.

Hier die vollständige Konfiguration für Ihre Standard-ssl.conf

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /srv/www/example.com/keys/ssl.crt;
    ssl_certificate_key /srv/www/example.com/keys/www.example.com.key;
    return 301 https://www.example.com$request_uri;
}

Randnotiz: Sie können ersetzen ssl on; Richtlinie mit listen 443 ssl; als Empfehlung von Nginx-Dokumentation.


31
2017-08-28 23:31



Sie müssen auch einrichten ssl_certificate und ssl_certificate_key Direktiven in diesem Block und verwenden listen 443 ssl; so dass es ein SSL vhost ist. - Tero Kilkanen
Bitte posten Sie aktuelle Inhalte default-ssl.conf. Vielleicht hat ein Tippfehler oder ein Problem mit der Nachbestellung das verursacht. - masegaloeh
Das ist peinlich: \ Der Schuldige war eine doppelte Nginx-Konfiguration in / etc / nginx / sites-enabled, /etc/nginx/sites-enabled/default-ssl.backup störte alle Weiterleitungen in default-ssl. Dummer Fehler. - Thomas V.
also musste ich 2 certs ausstellen: für www-domain und für nicht-www - vladkras
Wie kann dies zum Beispiel an Port 5007 erreicht werden: beispiel.com:5007 zu beispiel.com:5007 - CP3O


Werfen Sie einfach eine if-Anweisung ein und Sie sollten auf Ihrem Weg sein. Ich habe die Ergebnisse in curl.exe -I und allen anderen Fällen überprüft https://www.beispiel.com behandelt werden als 301. SSL ist schwierig, da es überprüft wird, bevor Sie 301 URL-Umleitung erhalten. Daher erhalten Sie Zertifikatfehler.

Persönlich mag ich das Entfernen der www's von der Domain, aber ich schrieb meinen Code unten, um Ihre Frage zu beantworten.

server {
listen 443 ssl;
listen [::]:443 ssl; # IPV6

server_name example.com www.example.com; # List all variations here

# If the domain is https://example.com, lets fix it!

if ($host = 'example.com') {
  return 301 https://www.example.com$request_uri;
}

# If the domain is https://www.example.com, it's OK! No changes necessary!

... # SSL .pem stuff
...
}

server {
listen 80;
listen [::]:80;

# If the domain is http://example.com or https://www.example.com, let's change it to https!

server_name example.com www.example.com;
return 310 https://www.example.com$request_uri;
}

4
2018-01-21 05:15





Die Art, wie ich es mache, ist eine if-Anweisung innerhalb des ssl-Serverblocks, der zu https von www umleitet

ssl_certificate /srv/www/example.com/keys/ssl.crt;
ssl_certificate_key /srv/www/example.com/keys/www.example.com.key;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AES128-SHA:RC4-MD5:ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:RSA+3DES:!ADH:!AECDH:!MD5:AES128-SHA;
ssl_prefer_server_ciphers on;
client_max_body_size 20M;

upstream app_server_ssl {
    server unix:/tmp/unicorn.sock fail_timeout=0;
}

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

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

    # redirect https://example.com to https://www.example.com
    # mainly for SEO purposes etc
    #we will use a variable to do that
    set $redirect_var 0;

    if ($host = 'example.com') {
      set $redirect_var 1;
    }
    if ($host = 'www.example.com') {
      set $redirect_var 1;
    }

    if ($redirect_var = 1) {
      return 301 https://www.example.com$request_uri;
    } 

    try_files $uri/index.html $uri.html $uri @app;

    # CVE-2013-2028 http://mailman.nginx.org/pipermail/nginx-announce/2013/000112.html
    if ($http_transfer_encoding ~* chunked) {
            return 444;
        }

    location @app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://app_server_ssl;
    }

    error_page 500 502 503 504 /500.html;

    location = /500.html {
        root /home/app/example/current/public;
    }
}

Natürlich immer dann, wenn Sie eine if-Anweisung in einer nginx-Konfigurationsdatei verwenden möchten. du hättest lesen sollen: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/


3
2017-07-14 11:29



die Bedingung if ($host = 'www.example.com') ist nicht nötig. - Karl.S


Es ist jetzt 2018 und ich habe mir vorgenommen, dieses hier zu wiederholen, falls jemand nach einer einfachen Lösung sucht.

Mein Ansatz als relativ Neuling ist es, die Dinge so einfach wie möglich zu machen. Grundsätzlich möchten Sie beide umleiten http://example.com und https://example.com zu https: //www.beispiel.com. Und das gelingt nur noch http://example.com 

Dies ist eine ziemlich einfache Operation, die nur zwei Serverblöcke benötigt (ich werde dies kurz in einer einzigen Konfigurationsdatei demonstrieren)

# 1. Server block to redirect all non-www and/or non-https to https://www
server {
    # listen to the standard http port 80
    listen 80; 

    # Now, since you want to route https://example.com to http://www.example.com....
    # you need to get this block to listen on https port 443 as well
    # alternative to defining 'ssl on' is to put it with listen 443
    listen 443 ssl; 

    # define server_name
    server_name example.com *.example.com; 

    # DO NOT (!) forget your ssl certificate and key
    ssl_certificate PATH_TO_YOUR_CRT_FILE;
    ssl_certificate_key PATH_TO_YOUR_KEY_FILE; 

    # permanent redirect
    return 301 https://www.example.com$request_uri;  
    # hard coded example.com for legibility 
}
# end of server block 1. nearly there....

# 2. Server block for the www (primary) domain
# note that this is the block that will ultimately deliver content
server {
    # define your server name
    server_name www.example.com; 

    # this block only cares about https port 443
    listen 443 ssl;

    # DO NOT (!) forget your ssl certificate and key
    ssl_certificate PATH_TO_YOUR_CRT_FILE;
    ssl_certificate_key PATH_TO_YOUR_KEY_FILE; 

    # define your logging .. access , error , and the usual 

    # and of course define your config that actually points to your service
    # i.e. location / { include proxy_params; proxy_pass PATH_TO_SOME_SOCKET; }
}
# End of block 2.
# voilà! 

Jetzt beide http://example.com und https://example.com sollte umleiten zu https://www.beispiel.com. Im Grunde leitet dieses Setup alles, was nicht www und / oder nicht-https ist, um https: // www.


0
2018-02-25 08:15





Um alle Anfragen umzuleiten https://www.example

Erstellen Sie einen Serverblock für die Redirect- und primäre Domain auf Ihrem SSL-Port (normalerweise 443) sowie den Standard-HTTP-Port 80

# non-www to ssl www redirect
server {
  listen 80; 
  listen 443 ssl;
  server_name example.com;
  return 301 https://www.example.com$request_uri;
  # ... ssl certs
}

# ssl setup for www (primary) domain
server {
  listen 80;
  listen 443 ssl;
  server_name www.example.com;
  if ($scheme = http) {
    return 301 https://www.example.com$request_uri;
  }
  # ... the rest of your config + ssl certs
}

Speichern und folgen Sie mit sudo nginx -s reload

Dies wird umleiten

http://example      301 -> https://www.example
https://example     301 -> https://www.example
http://www.example  301 -> https://www.example
https://www.example 200

-1
2017-11-25 20:20



Du vermisst ein ;im zweiten Serverblock in der if-Klausel. Es sollte sein return 301 https://www.example.com$request_uri; - Lukas Oppermann
Würde das aber auch funktionieren? Kann es aufpassen? http auf 443? - Lukas Oppermann
Du hast Recht, ich vermisse 80, ich habe es hinzugefügt. - lfender6445