在生产环境中,为了网站的安全访问,需要Nginx禁止一些非法访问,如恶意域名解析,直接使用IP访问网站。下面记录一些常用的配置示例:
1、禁止IP访问
如果没有匹配上server name就会找default默认,返回501错误。
server {
listen 80 default;
return 501;
}
2、通过301跳转到主页
server {
listen 80 default;
server_name _;
rewrite ^(.*) http://YourDomainName.example/$1 permanent;
}
3、凡是请求a.com 的都跳转到后面域名b.com上(这个方法需要放到server配置里)
if ($host ~ '^a.com'){
return 301 https://b.com$request_uri;
}
或者不是访问b.com网站的全部重定向到b.com
if ($host != 'b.com') {
rewrite ^/(.*)$ http://b.com/$1 permanent;
}
来自2022年12月1日的更新:
默认主机推荐以这种方式来屏蔽未知的访问请求
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl http2 default_server;
ssl_reject_handshake on;
}
HTTP:最关键的是 magic number 444。 444是nginx内置的错误代码。对我们来说 return 444 比 return 404还要好。因为 nginx 下即使return 404,也会有返回的header和一个包含错误信息的html body。但是return 444,服务器会立刻关闭连接,外部看来就好象服务不存在一样,但访问日志任然会出现再nginx的日志文件中。
HTTPS:自 1.19.4 起,Nginx 支持 ssl_reject_handshake 参数,设置为 on,当客户端传过来的 SNI 与已配置的 server name 都不匹配时,会拒绝 SSL 握手。本质需求就是为了当机器人或者奇怪的人类通过HTTPS访问你的IP时不暴露证书,也就不会暴露域名。