在 Nginx 中拒绝代理请求
暴露在公网上的 nginx 会收到针对开放 HTTP 代理的扫描, 调整配置,拒绝这些请求。

在网络上会遇到很多针对开发代理的扫描,这样的请求大概是

GET http://www.baidu.com/ HTTP/1.1
Host: www.baidu.com

除非特意去配置,nginx 一般都不会成为这样的正向代理。但是在收到这种请求时,nginx 很可能就把自己的主页 index.html 发送出去了。这样虽然没有什么安全问题,但是却会因为大量的代理扫描而浪费带宽和流量。

HTTP/1.1 要求所有服务器(即使不是代理服务器),处理 absolute URI 请求;虽然 HTTP/1.1 客户端只会向代理服务器发送请求时才使用 absolute URI. Nginx 遵守了这个规范,所以上面的请求会被识别为一个正常的 HTTP 请求,于是 nginx 就按照主机名去匹配各个 server {} 里面的 server_name. 这时,一般是找不到匹配的。

在没有匹配到虚拟主机时,就会 fallback 到 default_host 上。在没有指定 default_host 时,在配置文件中出现的第一个 server {} 就是 default_host. 于是你的网站首页就被返回了。

要解决这个问题,就应该另外指定一个 default_host, 并在其中拒绝掉所有请求。即,在原来的第一个 server {} 小节之前,加入

server {
    deny all;
}

一个完整的 /etc/nginx/conf.d/default 大概如下:

server {
    # reject unknown host
    deny all;
}

server {
    server_name www.example.com;

    root /var/www/html/;
    index index.html;
}

最后修改于 2015-04-08