Я разместил 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;
}
Вот ответ: 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;
}