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 Hostnagłó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_namezamiast $host. $server_namezawsze ocenia się co ty umieścić w server_namedeklaracji. Ale jeśli masz wiele subdomen lub używasz symbolu wieloznacznego, to nie zadziała, ponieważ $server_nameużywa tylko pierwszego wpisu po server_namedeklaracji, 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_serverblok, 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_serverdopasować 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.