Jeśli return 301 https://$host$request_uri;
domyślną odpowiedzią jest port 80, serwer może prędzej czy później uzyskać listę otwartych serwerów proxy [1] i zacząć być wykorzystywany do wysyłania ruchu w inne miejsce w Internecie. Jeśli twoje dzienniki wypełnią się takimi komunikatami, to wiesz, że to się stało:
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)"
Problem polega na tym $host
, że wywoła echo wszystkiego, co przeglądarka wyśle w Host
nagłówku, a nawet nazwę hosta z wiersza otwierającego HTTP, na przykład:
GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1
Z powodu tego problemu niektóre inne odpowiedzi tutaj zalecają użycie $server_name
zamiast $host
. $server_name
zawsze ocenia się co ty umieścić w server_name
deklaracji. Ale jeśli masz wiele subdomen lub używasz symbolu wieloznacznego, to nie zadziała, ponieważ $server_name
używa tylko pierwszego wpisu po server_name
deklaracji, a co ważniejsze, po prostu wyśle echo znaku zastępczego (nie rozwija go).
Jak więc obsługiwać wiele domen przy jednoczesnym zachowaniu bezpieczeństwa? W moich własnych systemach poradziłem sobie z tym dylematem, najpierw wymieniając default_server
blok, który nie używa $host
, a następnie wymieniając blok symboli wieloznacznych, który:
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;
}
(Możesz również podać więcej niż jedną domenę w drugim bloku).
Dzięki tej kombinacji niedopasowane domeny zostaną przekierowane gdzieś na stałe (zawsze example.com
), a domeny, które pasują do Twojej, trafią we właściwe miejsce. Twój serwer nie będzie przydatny jako otwarty serwer proxy, więc nie będziesz przyciągał problemów.
Jeśli czujesz się jak w domu, przypuszczam, że możesz również default_server
dopasować blok do żadnej z twoich legalnych domen i podać coś obraźliwego. . . .
[1] Technicznie „proxy” jest niewłaściwym słowem, ponieważ twój serwer nie wychodzi i nie spełnia wymagań klientów, po prostu wysyła przekierowanie, ale nie jestem pewien, jakie byłoby właściwe słowo. Nie jestem również pewien, jaki jest cel, ale wypełnia on dzienniki hałasem oraz zużywa procesor i przepustowość, więc równie dobrze możecie położyć temu kres.