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会捕获这些请求,防止它们意外匹配到其他业务服务,从而:

  1. 防止IP直接访问:避免通过服务器IP地址访问到网站内容

  2. 防止未绑定域名访问:拦截恶意域名解析或泛解析带来的请求

  3. 增强安全性:避免暴露第一个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匹配优先级为:

  1. 精确域名匹配(server_name www.example.com

  2. 左侧通配符(server_name *.example.com

  3. 右侧通配符(server_name www.example.*

  4. 正则表达式匹配

  5. 默认服务器(default_server)

五、配置注意事项

  1. 端口绑定:每个端口只能有一个default_server

  2. SSL配置:443端口需要SSL证书,即使只是返回错误

  3. 测试验证:配置后使用curl -H "Host: random-domain.com" http://server-ip测试

  4. 配置位置:建议放在其他业务server配置之前或之后,但必须显式声明

最佳实践:在生产环境中始终显式定义default_server,并使用return 444;确保安全性和性能

 

posted on 2025-12-17 16:14  Karlkiller  阅读(4)  评论(0)    收藏  举报

导航