Redirect www naar non-www en http naar https met nginx

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Mannekino
  • Registratie: Maart 2001
  • Laatst online: 24-03 21:12
Momenteel ben ik bezig met het bouwen van een basis template voor virtual hosts onder nginx. Hierbij wil ik zowel www naar non-www redirecten als http naar https. Ik ben uitgekomen op de onderstaande configuratie en dit lijkt goed te werken.

Ik heb alleen een vermoeden dat dit netter kan opgesteld kan worden. Zo heb ik bijvoorbeeld twee keer een 301 redirect als ik naar http://www.domain.example/ ga en volgens mij kan dat beter.

In principe heb ik de default template gebruikt die op Ubuntu geïnstalleerd is. Vervolgens heb ik certbot gebruikt met de nginx plugin om een certificaat te krijgen voor domain.example en www.domain.example. Certbot heeft de nodige wijzigingen aangebracht in de config. Daarna heb ik wijzigingen aangebracht voor www naar non-www.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
server {
        if ($host = www.domain.example) {
                return 301 $scheme://domain.example$request_uri;
        }

        if ($host != domain.example) {
                return 404;
        }

        root /var/www/html;

        index index.html index.nginx-debian.html;

        server_name domain.example www.domain.example;

        location / {
                try_files $uri $uri/ =404;
        }

        listen 443 ssl default_server;
        listen [::]:443 ssl ipv6only=on default_server;
        ssl_certificate /etc/letsencrypt/live/domain.example/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/domain.example/privkey.pem;
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

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

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

        listen 80 default_server;
        listen [::]:80 default_server;

        server_name domain.example www.domain.example;
        return 404;
}

Hebben jullie suggesties voor verbeteren van deze eerste opzet?

Beste antwoord (via Mannekino op 22-01-2022 23:44)


  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 01:48

Hero of Time

Moderator LNX

There is only one Legend

Ga eerst eens de documentatie lezen over het gebruik van if() in configuratie. Want dat wordt sterk afgeraden tenzij je echt een specifieke situatie hebt. Dat heb je niet. Geen idee waar je dit vandaan hebt gehaald, maar die bron moet je dus niet meer gebruiken.

Een server { } blok met listen 80 voor beide domeinen die naar je non-www https verwijst en een aparte voor www naar non-www over https is netter.


We bespreken overigens zaken als webservers niet meer direct in NOS, maar in SWS. Tikje die kant op.

Commandline FTW | Tweakt met mate

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 01:48

Hero of Time

Moderator LNX

There is only one Legend

Ga eerst eens de documentatie lezen over het gebruik van if() in configuratie. Want dat wordt sterk afgeraden tenzij je echt een specifieke situatie hebt. Dat heb je niet. Geen idee waar je dit vandaan hebt gehaald, maar die bron moet je dus niet meer gebruiken.

Een server { } blok met listen 80 voor beide domeinen die naar je non-www https verwijst en een aparte voor www naar non-www over https is netter.


We bespreken overigens zaken als webservers niet meer direct in NOS, maar in SWS. Tikje die kant op.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Volgens mij is die if helemaal niet nodig en kan je simpelweg een server configureren die naar poort 80 luistert en het request doorstuurt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
    listen 443 ssl http2;
    server_name www.domain.example domain.example;

    root /var/www/html;

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

    location / {
        try_files $uri $uri/ =404;
    }

    # etc
}

server {
    listen 80;
    server_name www.domain.example domain.example;

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

March of the Eagles


Acties:
  • 0 Henk 'm!

  • Mannekino
  • Registratie: Maart 2001
  • Laatst online: 24-03 21:12
Bedankt voor de reacties. Ik had ook nog een topic gepost op de community van Linode waar ik de VPS heb. Ik heb alle feedback verwerkt en ben nu tot de volgende configuratie gekomen. Het lijkt helemaal goed te werken en ik heb nu geen dubbele redirect meer als ik naar http://www.domain.example ga.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
server {
    return 301 https://domain.example$request_uri;

    listen 80;
    listen [::]:80;

    server_name www.domain.example;
}

server {
    return 301 https://domain.example$request_uri;
    
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name domain.example;
}

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

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
            
    ssl_certificate /etc/letsencrypt/live/domain.example/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/domain.example/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    root /var/www/html;

    index index.html index.nginx-debian.html;

    server_name domain.example;

    location / {
            try_files $uri $uri/ =404;
    }

    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    
    ssl_certificate /etc/letsencrypt/live/domain.example/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/domain.example/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}


Enige wat ik mij nu nog even afvraag is het volgende. In zowel jouw voorbeeld @XWB als op een voorbeeld van Linode staat er wel "http2" in het HTTPS gedeelte bij de "listen" regel, maar niet bij HTTP. Moet het daar ook komen te staan?

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 01:48

Hero of Time

Moderator LNX

There is only one Legend

Je kan de eerste twee server { } stukken samenvoegen door de servername van de tweede bij de eerste te zetten. Dus server_name domain.example www.domain.example;.

En wat die HTTP2 doet, dat staat in de documentatie van Nginx. Dat kan je prima zelf uitzoeken.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • Mannekino
  • Registratie: Maart 2001
  • Laatst online: 24-03 21:12
Bedankt, ik heb eerste blokken nog samengevoegd, dat had ik zelf ook kunnen bedenken natuurlijk. Het lijkt te werken zoals ik wil. Ik zal me nog even verdiepen in HTTP2.
Pagina: 1