为什么即使域名未托管在我的服务器上,nginx 也会给出 200 OK 响应?我该如何修复?

为什么即使域名未托管在我的服务器上,nginx 也会给出 200 OK 响应?我该如何修复?

我在 ip 为 123.123.123.123 的 nginx web 服务器上托管了 example.com,如果我在远程机器上使用带有主机头的 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;
}

默认配置文件

server {
    listen       80;
    server_name  123.123.123.123;

charset utf-8;
}

例如.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. 为什么会发生这种情况?我的意思是,为什么即使域名不在我的服务器上托管,服务器也会给出 200 OK 状态?
  2. 我该如何修复这个问题?我的意思是我怎么才能不给出 200 OK 状态并抛出一些其他标头响应代码?

答案1

答案如下:http://nginx.org/en/docs/http/request_processing.html

为什么会发生这种情况?我的意思是,为什么即使域名不在我的服务器上托管,服务器也会给出 200 OK 状态?

[通常] nginx 仅测试请求的标头字段“Host”,以确定应将请求路由到哪个服务器。如果其值与任何服务器名称都不匹配,或者请求根本不包含此标头字段,则 nginx 会将请求路由到此端口的默认服务器。在上述配置中,默认服务器是第一个 — 这是 nginx 的标准默认行为。

我该如何修复这个问题?我的意思是我怎么才能不给出 200 OK 状态并抛出一些其他标头响应代码?

如果不允许没有“Host”标头字段的请求,则可以定义一个直接丢弃请求的服务器:

服务器 { 监听 80; 服务器名称“”; 返回 444; }

这里将服务器名称设置为空字符串,将匹配没有“Host”头字段的请求,并返回特殊的nginx非标准代码444,从而关闭连接。

或者尝试对所有“默认”请求执行此操作

server {
    listen      80 default_server;
    server_name "";
    return      444;
}

相关内容