Wenn Sie return 301 https://$host$request_uri;
die Standardantwort auf Port 80 sind, kann es sein, dass Ihr Server früher oder später eine Liste offener Proxys [1] erhält und missbraucht wird, um Datenverkehr an eine andere Stelle im Internet zu senden. Wenn sich Ihre Protokolle mit Nachrichten wie dieser füllen, wissen Sie, dass es Ihnen passiert ist:
42.232.104.114 - - [25/Mar/2018:04:50:49 +0000] "GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1" 301 185 "http://www.ioffer.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Hotbar 4.1.8.0; RogueCleaner; Alexa Toolbar)"
Das Problem ist, dass $host
alles, was der Browser im Host
Header oder sogar im Hostnamen aus der Eröffnungszeile von HTTP sendet , wie folgt wiedergegeben wird:
GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1
Aufgrund dieses Problems empfehlen einige andere Antworten hier die Verwendung von $server_name
anstelle von $host
. $server_name
Wertet immer so aus, wie Sie es in der server_name
Erklärung angegeben haben. Wenn Sie jedoch mehrere Subdomains haben oder einen Platzhalter verwenden, funktioniert dies nicht, da $server_name
nur der erste Eintrag nach der server_name
Deklaration verwendet wird und vor allem nur ein Platzhalter zurückgegeben wird (nicht erweitert).
Wie kann man also mehrere Domänen unterstützen und gleichzeitig die Sicherheit gewährleisten? Auf meinen eigenen Systemen habe ich dieses Dilemma gelöst, indem ich zuerst einen default_server
Block aufgelistet habe, der nicht verwendet wird $host
, und dann einen Platzhalterblock aufgeführt habe, der Folgendes bewirkt:
server {
listen 80 default_server;
server_name example.com;
return 301 https://example.com$request_uri;
}
server {
listen 80;
server_name *.example.com;
return 301 https://$host$request_uri;
}
(Sie können auch mehr als eine Domain im zweiten Block angeben.)
Bei dieser Kombination werden nicht zugeordnete Domains (immer example.com
) an einen festen Ort umgeleitet , und Domains, die mit Ihren eigenen übereinstimmen, werden an die richtige Stelle verschoben . Ihr Server ist nicht als offener Proxy geeignet, sodass Sie keine Probleme haben.
Wenn Sie sich feurig fühlen, können Sie wahrscheinlich auch dafür sorgen, dass der default_server
Block keiner Ihrer legitimen Domänen entspricht, und etwas Anstößiges anrichten. . . .
[1] Technisch gesehen ist "Proxy" das falsche Wort, da Ihr Server nicht ausfällt und Anforderungen für die Clients erfüllt, sondern nur eine Umleitung sendet, aber ich bin mir nicht sicher, was das richtige Wort wäre. Ich bin mir auch nicht sicher, was das Ziel ist, aber es füllt Ihre Protokolle mit Lärm und verbraucht Ihre CPU und Bandbreite, so dass Sie es genauso gut verhindern können.