关于NGINX反向代理的一些坑

Monologue 发布于 2024-09-29 417 次阅读


$host$http_host 的比较

特性 $host $http_host
来源 - Host 头部时:取 Host 头部中的主机名部分
- Host 头部时:取 Nginx 配置中的 server_name
- Host 头部时:取原始的 Host 头部内容
- Host 头部时:为空
包含端口号 不包含端口号,即使 Host 头部中有端口号也会被去除 包含端口号,如果 Host 头部中有端口号会保留
大小写处理 将主机名转换为小写 保留原始大小写格式
非法字符处理 过滤掉主机名中非法的字符 不做处理,保留原始内容
Host 头部时的值 使用配置中的 server_name 为空
典型应用场景 - 生成标准化的主机名
- 重定向、日志记录
- 防止主机名注入攻击
- 需要保留客户端提供的原始主机信息
- 后端服务需要完整的 Host 信息
安全性 更安全,适合默认使用 可能存在安全风险,需谨慎使用

proxy_pass 后面是否带斜杠 / 的区别

特性 proxy_pass 带斜杠 / proxy_pass 不带斜杠
配置示例 proxy_pass http://backend/; proxy_pass http://backend;
URI 重写行为 替换匹配的 location 路径 保留匹配的 location 路径
后端接收的 URI backend_uri + 剩余请求路径 backend_uri + 原始请求路径
客户端请求示例 http://yourserver/app/page1 http://yourserver/app/page1
后端接收的请求 http://backend/page1 http://backend/app/page1
应用场景 后端不需要 location 前缀 后端需要完整的请求路径
注意事项 proxy_pass URI 末尾需有 / proxy_pass URI 末尾不应有 /

Nginx 一些其他配置

指令 作用 详细说明 示例用法
proxy_set_header Range $http_range; 将客户端的 Range 头部传递给后端服务器 - 支持断点续传和流媒体播放
- 默认情况下 Nginx 不会转发 Range 头部
- 配置后可使后端处理部分内容请求(返回 206 Partial Content
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range; 将客户端的 If-Range 头部传递给后端服务器 - 与 Range 头部配合,支持条件性的范围请求
- 默认情况下 Nginx 不会转发 If-Range 头部
- 配置后后端可正确处理条件性请求
proxy_set_header If-Range $http_if_range;
proxy_redirect off; 禁用 Nginx 对后端返回的重定向头部的自动修改 - 默认情况下,Nginx 会重写后端返回的 LocationRefresh 头部
- 配置此指令后,Nginx 将直接传递后端的重定向头部,不做修改
proxy_redirect off;
此作者没有提供个人介绍。
最后更新于 2024-09-29