User Tools

Site Tools


misc:code_snippets:nginx

This is an old revision of the document!


Codeschnipsel für nginx Konfigurationen

Einige nützliche Codeschnipsel für Methoden und Aufgaben mit nginx.

nginx Version nicht senden

SSL/TLS erzwingen

# enforce SSL
server {
    listen 80;
    listen [::]:80;
    return 301 https://$host$request_uri;
}

Mit obigem Code im http{}-Block vor allen anderen server{}-Blöcken wird für alle definierten Hosts, auf die nginx antwortet, Verschlüsselung via https erzwungen. Funktioniert sowohl mit IPv4 als auch IPv6.

Crawler verbieten

# disallow all kind of automated crawlers
location /robots.txt {
    return 200 "User-agent: *\nDisallow: /";
}

Der Code liefert automatisch innerhalb des zugehörigen server{} eine robots.txt zurück, die automatisierte Crawler generell verbietet, ohne dass sich diese Datei auf dem Server selbst befinden muss.

Text anstatt Datei zurückliefern

location / {
    return 200 "Welcome to this webpage!";
    add_header Content-Type text/plain;
}

Soll anstelle einer Webseite beispielsweise ein Platzhaltertext zurückgeliefert werden, kann dies mithilfe des passenden Headers umgesetzt werden. In diesem Fall wird die Rückgabe im Fall des Aufrufs des root-Verzeichnisses ausgeben.

Security Header

# Add headers to serve security related headers
add_header X-Frame-Options DENY;
add_header Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'" always;  # enforce TLS on all assets and prevent mixed content warnings
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Permitted-Cross-Domain-Policies none;
add_header X-Download-Options noopen;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" always;

Von mir verwendete Header-Instruktionen, die die Sicherheit erhöhen. So wird das Einbinden fremder Seiten/Inhalte via Frames verboten (XSS), CSP-Richtlinien zum sicheren Nachladen von Inhalten gesetzt, https-Verbindungen bei zukünftigen Besuchen erzwungen und mehr.

Reverse Proxy

server {
    listen 80;
    listen [::]:80;
    listen 443;
    listen [::]:443;
    server_name domain.tld *.domain.tld example.com;
 
    ssl off;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Permitted-Cross-Domain-Policies none;
 
    location / {
        proxy_pass http://192.168.123.123:80$request_uri;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Server-Block zur Einrichtung von nginx als Reverse Proxy. Dabei wird sowohl IPv4, IPv6, SSL/TLS-Verschlüsselung als auch unverschlüsselte Verbindungen abgedeckt (entsprechende listen-Direktiven). Durch die hinzugefügten Header und ssl off werden serverseitige Absicherungen wie HSTS oder CSP-Richtlinien außer Kraft gesetzt. Die Weiterleitung selbst erfolgt in diesem Fall zu einem lokalen Server, der hinter der IP 192.168.123.123 auf Port 80 hört.

Basisnamen von URIs

# Gets the basename of the original request
map $request_uri $request_basename {
    ~/(?<captured_request_basename>[^/?]*)(?:\?|$) $captured_request_basename;
}
 
# Gets the basename of the current uri
map $uri $basename {
    ~/(?<captured_basename>[^/]*)$ $captured_basename;
}

Mithilfe des map Moduls von nginx können Methoden definiert werden, die den Basisnamen aus einem Request oder der aktuellen URI extrahieren. Maps müssen im http{}-Block definiert werden, wodurch sie mittels Vererbung auch in den server{}-Blöcken zur Verfügung stehen.

misc/code_snippets/nginx.1502657078.txt.gz · Last modified: by sascha