在Nginx中,当用户能通过IP地址+端口访问到服务,而你已经配置了server_name,这通常与Nginx的虚拟主机匹配机制有关。以下是具体原因和解决方法:
Nginx处理请求时,会根据请求头中的Host字段匹配对应的server块:
需要添加一个默认服务器块,专门处理不匹配server_name的请求(如IP访问),并返回拒绝响应(如403/404)。
示例配置如下:
# 1. 默认服务器:处理所有不匹配server_name的请求(如IP访问)
server {
listen 8899 ssl default_server; # 关键:default_server指定为默认服务器
server_name _; # 通配符,表示匹配所有未被其他server_name匹配的请求
# 禁用IP访问:直接返回403禁止访问
return 403;
# 若使用SSL,需要配置证书(可复用已有证书,或仅用于拒绝访问)
ssl_certificate /path/to/your/cert.pem;
ssl_certificate_key /path/to/your/key.pem;
}
# 2. 你的业务服务器:仅处理www.cdsy.xyz的请求
server {
listen 8899 ssl;
server_name www.cdsy.xyz; # 仅匹配该域名
# 你的其他配置(如root、location等)
# ...
ssl_certificate /path/to/your/cert.pem;
ssl_certificate_key /path/to/your/key.pem;
}
配置后重启Nginx,IP+端口的访问会被默认服务器拦截,只有www.cdsy.xyz:8899能正常访问。
即使注释了 listen [::]:8899 default_server;,用户仍能通过 IP+端口访问,原因在于:Nginx 的“默认服务器”机制不仅针对 IPv6([::] 是 IPv6 地址格式),还会作用于 IPv4,且默认服务器是“自动分配”的。
需要同时针对 IPv4 和 IPv6 配置默认服务器,明确拒绝 IP 访问。完整配置示例:
# 1. IPv4 默认服务器:拒绝 IP 访问
server {
listen 8899 ssl default_server; # 明确标记为 IPv4 的默认服务器
server_name _; # 匹配所有未被其他 server_name 匹配的请求
return 403; # 拒绝访问
# SSL 证书配置(可复用业务证书)
ssl_certificate /path/to/your/cert.pem;
ssl_certificate_key /path/to/your/key.pem;
}
# 2. IPv6 默认服务器:拒绝 IP 访问(即使不使用 IPv6,也建议配置)
server {
listen [::]:8899 ssl default_server; # 明确标记为 IPv6 的默认服务器
server_name _;
return 403;
# 同上,配置 SSL 证书
ssl_certificate /path/to/your/cert.pem;
ssl_certificate_key /path/to/your/key.pem;
}
# 3. 你的业务服务器:仅处理域名请求
server {
listen 8899 ssl; # 不要加 default_server,避免成为默认服务器
listen [::]:8899 ssl; # 如需支持 IPv6 域名访问,可添加此行
server_name www.cdsy.xyz; # 仅匹配该域名
# 你的其他业务配置(如 root、location 等)
# ...
ssl_certificate /path/to/your/cert.pem;
ssl_certificate_key /path/to/your/key.pem;
}
这样就能确保只有 www.cdsy.xyz:8899 可访问,IP+端口的访问会被拒绝。

