一 nginx与Location响应头细节探讨
① 重定向和Location回顾
多种重定向跳转方式的差异
nginx之absolute_redirect、server_name_in_redirect、port_in_redirect 共同控制Location响应头
② STS响应头导致307重定向
++++++++++++++"第一次访问 http://www.baidu.com"++++++++++++++
观察点: 请求'https://www.baidu.com',并且返回'STS'安全响应头
++++++++++++++"第二次访问 http://www.baidu.com"++++++++++++++
强调: 浏览器并没有发起'网络请求',而是浏览器'内部'给了一个'虚拟'响应进行重定向
思考:浏览器是'如何知道'这个'www.baidu.com这个域名'需要使用'严格传输安全 HSTS' 呢?
答案:第一次重定向到'https://www.baidu.com',响应头中有一个'特殊'的响应头:
Strict-Transport-Security: max-age=172800
+++++++++++++++++ "关键知识点" +++++++++++++++++
1)'307' Internal Redirect
2) Non-Authoritative-Reason: HSTS --> "浏览器返回的虚拟响应头"
备注: HSTS是HTTP严格传输安全协议'HTTP Strict Transport Security',简称:'HSTS'
3) Strict-Transport-Security --> "响应头"
浏览器自我进行307重定向
1)打开地址: chrome://net-internals/#hsts
2)查询域名,在"Query HSTS/PKP domain"输入'域名'
前端请求307导致CORS跨域失败 清除浏览器的HSTS记录
③ nginx的rewrite和return导致301或302重定向
1) '301'永久重定向
return 301 https://www.baidu.com
rewrite ^ https://www/aidu.com permanent
2) '302'临时重定向
return 302 https://www.baidu.com
rewrite ^ https://www/aidu.com redirect
④ proxy_redirect
说明: 修改上游的'Location'或'Refresh'响应头
应用场景,修改'Location'组成部分:
[1]、修改'协议'
[2]、修改'域名'和'端口'
[3]、修改'url'
案例参考 HTTP重定向
解读:
1) 如果'replacement'省略'域名和端口'
2) 则使用nginx'监听的协议,主域名(第一个),以及对应的监听端口'
解读:如果使用'default'参数,将根据'location'和'proxy_pass'参数的设置来决定
细节:如果'redirect'与原始'Location'不匹配,则nginx什么'也不做'
++++++++++ 将上游服务器发出的'Location'中http协议修改为'https'协议 ++++++++++
proxy_redirect http:// https://
说明: 在'replacemnet'和'redirect'都可以使用'变量'
说明: 多个'proxy_redirect'指令时,依次进行'Location和Refersh'匹配,首先匹配替换即停止
说明:
1) 如果'off',nginx不继承'上层的'proxy_redirect指令
2) 也即nginx不对'Location'和'Refresh'响应头'不做'任何修改
⑤ Location疑难问题汇总
排查方向:
1) 网站架构 --> 使用的'协议'
eg: client --> https --> nginx代理 --> http --> tomcat
eg: client --> http --> nginx代理 --> https --> tomcat
2) 日志打印:
$upstream_http_location --> 后端原始的'Location响应头'
解决nginx https代理tomcat redirect问题
1) proxy_redirect http:// $scheme://;
使用proxy_redirect将location中的协议转换为'请求nginx的协议'
2) port_in_redirect on;
使用port_in_redirect on 指示nginx'使用请求的端口',而不是使用'默认'端口
ngx_headers_more模块如何影响Location响应头
nginx访问https跳转到http的解决方法