Почему nginx выдает ответ 200 OK, даже если домен не размещен на моем сервере? и как я могу это исправить?

Я разместил example.com на веб-сервере nginx по адресу IP 123.123.123.123, и если я использую curl с такими заголовками хоста с удаленной машины

curl -v -H "Host: example.com" 123.123.123.123/

, я получаю

curl -v -H "Host: example.com" 123.123.123.123/
*   Trying 123.123.123.123...
* Connected to 123.123.123.123 (123.123.123.123) port 80 (#0)
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.9.9
< Date: Tue, 15 Dec 2015 01:34:22 GMT
< Content-Type: text/html; charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Set-Cookie: __cfduid=d2a30e617da2fbe890a6855ba4d993bc61450143261; expires=Wed, 14-Dec-16 01:34:21 GMT; path=/; domain=.example.com; HttpOnly
< Vary: Accept-Encoding
< Set-Cookie: PHPSESSID=mmdnqp3j4fnf0ph57krl696rb2; path=/
< CF-RAY: 254e67dae06335a8-LHR

, что нормально, поскольку example.com размещен на сервере с IP 123.123.123.123

, но если я изменю заголовок хоста на любой другой домен, например anyother_domain.com

curl -v -H "Host: anyother_domain.com" 123.123.123.123/

я получаю это

curl -v -H "Host: anyother_domain.com" 123.123.123.123/
*   Trying 123.123.123.123...
* Connected to 123.123.123.123 (123.123.123.123) port 80 (#0)
> GET / HTTP/1.1
> Host: anyother_domain.com
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.9.9
< Date: Tue, 15 Dec 2015 01:30:29 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 612
< Last-Modified: Sat, 12 Dec 2015 16:03:23 GMT
< Connection: keep-alive
< ETag: "566c454b-264"
< Accept-Ranges: bytes

вот мой nginx.conf файл

worker_processes 4;

events {
  worker_connections 1024;
}

http {
        include  mime.types;
        default_type application/octet-stream;
        sendfile on;
        gzip on;
        charset utf-8;

include /usr/local/nginx/conf/sites-enabled/*.conf;
}

default.conf

server {
    listen       80;
    server_name  123.123.123.123;

charset utf-8;
}

example.com.conf

server {
    server_name  www.example.com;
    return       301 http://example.com$request_uri;
    access_log  /dev/null;
}

server {
server_name  example.com;
}
  1. Почему это происходит? {{1 }} я имею в виду, почему сервер выдает статус 200 OK, даже если домен не размещен на моем сервере?
  2. как я могу это исправить? я имею в виду, как я могу не дать статус 200 ОК и выдать другой код ответа заголовка?
0
задан 15 December 2015 в 03:56
1 ответ

Вот ответ: http://nginx.org/en/docs/http/request_processing.html

Почему это происходит?я имею в виду, почему сервер выдает статус 200 OK, хотя домен не размещен на моем сервере?

[Обычно] nginx проверяет только поле заголовка запроса «Хост» на определить, на какой сервер следует направить запрос. Если его значение не соответствует ни одному имени сервера, или запрос не содержит этого поле заголовка вообще, тогда nginx направит запрос в значение по умолчанию сервер для этого порта. В приведенной выше конфигурации сервер по умолчанию это первое - стандартное поведение nginx по умолчанию.

как я могу это исправить? я имею в виду, как я могу не присвоить статус 200 OK и выдать другой код ответа заголовка?

Если запросы без поля заголовка «Host» не должны быть разрешены, a сервер, который просто отбрасывает запросы, можно определить:

server { слушать 80; название сервера ""; return 444; }

Здесь для имени сервера задана пустая строка, которая будет соответствовать запросам без поля заголовка «Хост», и специальный нестандартный код nginx 444, который закрывает соединение.

Или попробуйте это для всех запросов «по умолчанию»

server {
    listen      80 default_server;
    server_name "";
    return      444;
}
2
ответ дан 4 December 2019 в 13:45

Теги

Похожие вопросы