关键在于确保重定向目标可信可控:禁用$host等客户端变量,改用$server_name或固定域名;配置default_server拦截非法host;代理场景强制重写location头并限制后端透传;高危跳转入口增加referer校验和token验证。

在 Nginx 中保护 HTTPS 站点免受恶意重定向攻击,关键不是禁用跳转,而是确保所有重定向目标可信、可控、不可伪造。攻击者常利用开放重定向(Open Redirect)、Host 头注入、后端 Location 透传等路径诱导用户访问钓鱼页面,而这些漏洞几乎都源于配置中对客户端输入的轻信。
严格校验重定向参数,禁用动态拼接
业务中常见的登录后跳转、OAuth 回调等场景,若直接使用 $arg_redirect、$arg_next 等参数构造跳转地址,极易被滥用。必须拒绝任何含协议、域名、IP 或特殊字符的输入:
- 用
if指令拦截危险模式:例如if ($args ~* "(redirect|next)=([^&]*://|//|@|\d{1,3}\.\d{1,3}\.)") { return 400; } - 只允许相对路径跳转:如
/dashboard、/profile,可用正则匹配前缀,拒绝以http://、https://、//开头的值 - 避免在
rewrite或return 302中直接拼接用户参数,改用map白名单机制预定义合法目标
HTTPS 跳转不依赖 $host,改用可信变量
HTTP → HTTPS 自动跳转是高危入口。常见错误写法 return 301 https://$host$request_uri; 允许攻击者通过伪造 Host 头(如 curl -H "Host: evil.com" http://yoursite.com)劫持跳转目标:
- 单域名站点:直接写死域名,如
return 301 https://www.example.com$request_uri; - 多域名支持:用
$server_name替代$host,该变量来自配置中的server_name指令,无法被客户端篡改 - 必须配置
default_server拦截非法 Host 请求,未匹配的请求应立即断连(return 444)或拒访(return 403)
代理场景下清洗后端返回的 Location 头
当 Nginx 作为反向代理时,后端应用返回的 Location: http://attacker.com/xxx 若未经处理即透传,会直接触发钓鱼跳转:
- 强制重写 Location 响应头:
proxy_redirect ~^http://[^/]+(.*)$ https://$server_name$1; - 禁止将原始 Host 透传给后端:
proxy_set_header Host $proxy_host;或固定为可信后端域名 - 慎用
proxy_hide_header Location,除非确认业务不依赖该头;更稳妥的是配合add_header重置跳转逻辑
叠加 Referer 与一次性 Token 双因子验证
对高风险跳转入口(如 /auth/callback、/sso/jump),仅靠路径白名单不够,需结合请求上下文增强可信度:
- 限制 Referer 必须为本站主域名:
valid_referers server_names *.example.com;,不匹配则return 403 - 跳转前由后端生成短时效 token 并写入
HttpOnly Cookie,Nginx 在重定向前用$cookie_token校验有效性(需 Lua 或auth_request模块支持) - 关闭目录列表、禁用空 Host 头响应、禁用危险 HTTP 方法(如 TRACE、OPTIONS),减少辅助攻击面











