Toon posts:

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

Pagina: 1
Acties:

Vraag


  • Mannekino
  • Registratie: Maart 2001
  • Laatst online: 19-01 23: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: 22:20

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
  • 0Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 22:20

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


  • 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;
    }
}

La Batterie des Hommes sans Peur


  • Mannekino
  • Registratie: Maart 2001
  • Laatst online: 19-01 23: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?

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 22:20

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


  • Mannekino
  • Registratie: Maart 2001
  • Laatst online: 19-01 23: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


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee