我在 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;
}
- 为什么会发生这种情况?我的意思是,为什么即使域名不在我的服务器上托管,服务器也会给出 200 OK 状态?
- 我该如何修复这个问题?我的意思是我怎么才能不给出 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;
}