nginx版本
1.22.1
依赖模块
stream、stream_ssl、stream_ssl_preread
配置代码
# 如:8080端口根据http和https分别转向不同的服务:https跳转至127.0.0.1:8081,http跳转至127.0.0.1:8082,在nginx配置文件中添加如下代码即可:
# 注意,以下代码位置 和 http 配置平级
# begin
stream {
upstream web_https {
# 可根据实际情况调整
server 127.0.0.1:8081;
}
upstream web_http {
# 可根据实际情况调整
server 127.0.0.1:8082;
}
# 关于 ssl_preread_protocol 相关说明请参考:https://nginx.org/en/docs/stream/ngx_stream_ssl_preread_module.html
map $ssl_preread_protocol $upstream {
"" web_http;
# ssl_preread_protocol的值与https中 ssl_protocols 有关
"TLSv1.1" web_https;
"TLSv1.2" web_https;
"TLSv1.3" web_https;
default web_https;
}
# http and https on the same port
server {
listen 8080;
proxy_pass $upstream;
ssl_preread on;
}
}
# end
# 若在同一台服务器,可添加如下代码进行测试
# https
server
{
# https
listen 8081 ssl http2;
server_name 127.0.0.1;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
# ssl配置 begin
# 略...
# ssl配置 end
location / {
default_type application/json;
return 200 '{"msg":"this is [https] page"}';
}
}
# http
server
{
# http
listen 8082;
server_name 127.0.0.1;
location / {
default_type application/json;
return 200 '{"msg":"this is [http] page"}';
}
}
# 配置完毕后重启服务即可。
重启服务
service nginx restart;
测试
# http访问
http://127.0.0.1:8080
# 结果:'{"msg":"this is [http] page"}'
# https访问
https://127.0.0.1:8080
# 结果:'{"msg":"this is [https] page"}'
其他问题
若测试http连接时自动跳转至https,控制台提示307
方案1
在 Chrome 的 URL 字段中输入以下内容:chrome://net-internals/#hsts,然后搜索您的网站并将其删除。
方案2
您可能是在顶级域中设置的 HSTS 并包含了子域,因此可以从其中删除子域。(原文:You may also set this at a top level domain and include subdomains so you may need to delete from there.)(对于此处的「顶级域」我的理解是指一级域名 / 主域名,原文想描述的情况是 Strict-Transport-Security 字段中设置了子域的情况,语法为 Strict-Transport-Security: max-age=<expire-time>; includeSubDomains。这样当子域不再需要 HTTPS 时,可以对父域的 Header 进行更新以丢弃 includeSubDomains。)
方案3
更改服务器配置中的 Header Strict-Transport-Security 字段:先发布 max-age 为 0 的 Header,然后重新访问网站以清除此 Header,最后停止发布此 Header。这对于其他不太容易清除 Header 的浏览器很有帮助。
参考:HTTPS -> HTTP 引起的 307 状态码与 HSTS