Якщо ви 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] Технічно "проксі" - це неправильне слово, тому що ваш сервер не виходить і не виконує запити для клієнтів, просто надсилає переспрямування, але я не впевнений, яким би було правильне слово. Я також не впевнений, у чому мета, але він заповнює ваші журнали шумом і споживає ваш процесор і пропускну здатність, так що ви можете також зупинити його.