Если вы return 301 https://$host$request_uri;
используете ответ по умолчанию для порта 80, то ваш сервер может рано или поздно попасть в список открытых прокси-серверов [1] и начать злоупотреблять отправкой трафика в другие места в Интернете. Если ваши журналы заполнены сообщениями вроде этого, то вы знаете, что это случилось с вами:
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)"
Проблема в том, что $host
будет возвращаться то, что браузер отправляет в Host
заголовке, или даже имя хоста из строки открытия HTTP, например:
GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1
Из-за этой проблемы некоторые другие ответы здесь рекомендуют использовать $server_name
вместо $host
. $server_name
всегда оценивает то, что вы положили в server_name
декларации. Но если у вас есть несколько поддоменов или вы используете подстановочный знак, это не сработает, поскольку $server_name
использует только первую запись после server_name
объявления и, что более важно, просто отобразит подстановочный знак (не раскрывая его).
Так как же поддерживать несколько доменов при сохранении безопасности? В моих собственных системах я столкнулся с этой дилеммой, сначала перечислив default_server
блок, который не использует $host
, а затем перечислив блок подстановочных знаков, который делает:
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;
}
(Вы также можете перечислить более одного домена во втором блоке.)
С этой комбинацией несопоставленные домены будут перенаправлены куда-то жестко (всегда example.com
), а домены, которые соответствуют вашим собственным, попадут в нужное место. Ваш сервер не будет полезен в качестве открытого прокси, поэтому вы не будете привлекать неприятности.
Если вы чувствуете себя раздраженным, я полагаю, вы могли бы сделать так, чтобы default_server
блок соответствовал ни одному из ваших законных доменов и служил чему-то оскорбительному. , , ,
[1] Технически «прокси» - неправильное слово, потому что ваш сервер не работает и не выполняет запросы клиентов, просто отправляет перенаправление, но я не уверен, какое слово будет правильным. Я также не уверен, какова цель, но она наполняет ваши журналы шумом и потребляет ваш процессор и пропускную способность, так что вы могли бы также положить этому конец.