HTTP状态码
500 Internal Server Error(内部服务器错误)
-
表示服务器在处理请求时遇到了意外情况,无法完成请求。这通常是服务器端的代码错误、配置问题或资源不足导致的通用错误。
499 Client Closed Request(客户端关闭请求)
-
这是一个非标准的Nginx状态码,表示在服务器处理请求完成之前,客户端主动关闭了连接(例如关闭了浏览器或取消了请求)。
404 Not Found(未找到)
-
表示服务器无法找到请求的资源。这是最常见的错误之一,通常是因为URL拼写错误、资源已被删除或移动,而服务器上没有对应的页面。
403 Forbidden(禁止访问)
-
表示服务器理解请求,但拒绝执行。与401未授权不同,403通常意味着客户端身份已验证,但没有访问该资源的权限。
HTTP状态码分为五大类,以下是常见的状态码及其含义:
1xx 信息性状态码(Informational)
-
100 Continue:服务器已收到请求头,客户端应继续发送请求体
-
101 Switching Protocols:客户端请求切换协议,服务器已同意
2xx 成功状态码(Success)
-
200 OK:请求成功,这是最常见的成功状态码
-
201 Created:请求成功且服务器创建了新资源
-
204 No Content:请求成功,但响应中没有内容
3xx 重定向状态码(Redirection)
-
301 Moved Permanently:资源已永久移动到新URL
-
302 Found:资源临时移动到其他位置
-
304 Not Modified:资源未修改,可使用缓存版本
4xx 客户端错误状态码(Client Error)
-
400 Bad Request:请求语法错误,服务器无法理解
-
401 Unauthorized:需要身份验证
-
403 Forbidden:服务器理解请求但拒绝执行
-
404 Not Found:请求的资源不存在
-
405 Method Not Allowed:请求方法不被允许
-
408 Request Timeout:请求超时
-
429 Too Many Requests:请求过于频繁(限流)
5xx 服务器错误状态码(Server Error)
-
500 Internal Server Error:服务器内部错误
-
502 Bad Gateway:网关或代理服务器从上游服务器收到无效响应
-
503 Service Unavailable:服务器暂时无法处理请求(过载或维护)
-
504 Gateway Timeout:网关或代理服务器等待上游服务器响应超时
特殊状态码:
-
499 Client Closed Request:Nginx特有,客户端在服务器响应前关闭连接
Question:
3台服务器上分别部署了3个对外服务,域名分别为a , b, c,a和b两个域名都通过nginx反向代理出去,c域名没有在nginx中配置,用户访问c域名时,页面返回是怎样的?
当用户访问未在Nginx中配置的域名c时,返回的页面取决于Nginx的具体配置和DNS解析。以下是几种常见情况:
1. 如果所有域名都指向同一台Nginx服务器
-
情况A:Nginx配置了默认服务器(default_server)
请求会匹配到
default_server配置的虚拟主机,通常返回404 Not Found错误。 -
情况B:Nginx未配置默认服务器
Nginx会将请求交给监听相同端口的第一个server块处理。用户可能意外看到a或b服务的内容(取决于配置顺序),这存在安全风险。
2. 如果c域名直接指向自己的服务器IP
-
请求不经过Nginx,直接访问c服务器上部署的服务,返回c服务的正常页面。
3. 实际生产环境建议
为避免未绑定域名访问带来的安全风险,建议在Nginx配置中添加默认服务器块:
server { listen 80 default_server; server_name _; return 404; # 或 return 444; }
关键点:最终返回什么页面,取决于DNS解析路径和Nginx的default_server配置。在未特殊配置的情况下,更可能看到404错误或被第一个server块代理的内容。
详细介绍下nginx中的默认服务器块(default_server)
Nginx中的默认服务器块(default_server)是一个重要的安全配置,用于处理未匹配到任何特定域名的请求。以下是详细解析:
一、默认服务器块的作用
当客户端请求的域名未在Nginx配置中定义时,default_server会捕获这些请求,防止它们意外匹配到其他业务服务,从而:
-
防止IP直接访问:避免通过服务器IP地址访问到网站内容
-
防止未绑定域名访问:拦截恶意域名解析或泛解析带来的请求
-
增强安全性:避免暴露第一个server配置的内容
二、配置方式
1. 显式定义(推荐)
server { listen 80 default_server; # 关键:添加default_server参数 server_name _; # 使用下划线作为占位符 return 403; # 或 return 444; }
- default_server参数明确指定此server为默认处理者
- server_name _中的下划线_只是一个占位符,并非特殊语法,可以使用任何非业务域名
- 从Nginx 0.8.21版本开始支持default_server参数,早期版本使用default
三、响应状态码选择
|
状态码 |
含义 |
适用场景 |
|---|---|---|
|
403 |
Forbidden |
明确拒绝访问,返回标准错误页 |
|
444 |
Nginx特有 |
直接关闭连接,不发送任何响应 |
|
404 |
Not Found |
模拟资源不存在 |
|
301/302 |
重定向 |
跳转到指定页面 |
444状态码的优势:完全不返回内容,节省带宽且更安全
四、实际应用场景
1. 防止IP访问
server { listen 80 default_server; server_name _; return 444; } server { listen 443 ssl default_server; server_name _; ssl_certificate cert.pem; ssl_certificate_key cert.key; return 444; }
2. 捕获空Host头请求
server { listen 80; server_name ""; # 空字符串匹配无Host头的请求 return 444; }
3. 优先级规则
Nginx的server匹配优先级为:
-
精确域名匹配(
server_name www.example.com) -
左侧通配符(
server_name *.example.com) -
右侧通配符(
server_name www.example.*) -
正则表达式匹配
-
默认服务器(default_server)
五、配置注意事项
-
端口绑定:每个端口只能有一个
default_server -
SSL配置:443端口需要SSL证书,即使只是返回错误
-
测试验证:配置后使用
curl -H "Host: random-domain.com" http://server-ip测试 -
配置位置:建议放在其他业务server配置之前或之后,但必须显式声明
最佳实践:在生产环境中始终显式定义default_server,并使用return 444;确保安全性和性能
posted on 2025-12-17 16:14 Karlkiller 阅读(4) 评论(0) 收藏 举报
浙公网安备 33010602011771号