问题背景
家庭宽带申请的公网 IP,80 和 443 端口被封锁,无法直接通过公网访问。希望如果 443 端口可访问,则优先使用。如果 443 端口不可访问,则使用 8443 端口。
配置环境:
- 基于宝塔面板搭建,使用 nginx。
- 监听端口:443(SSL)和 8443(SSL)。
- 启用了 强制 HTTPS,内网 HTTP 请求自动跳转到 HTTPS。
问题:
- 开启强制HTTPS导致非443 端口(如 8443)访问时强制跳转到 443,公网无法使用 8443 提供的 HTTPS 服务。
现象对比
原始规则【宝塔自带】
# HTTP_TO_HTTPS_START
if ($server_port !~ 443) {
rewrite ^(/.*)$ https://$host$1 permanent;
}
# HTTP_TO_HTTPS_END
或
# HTTP_TO_HTTPS_START
set $isRedcert 1;
if ($server_port != 443) {
set $isRedcert 2;
}
if ($uri ~ /\.well-known/) {
set $isRedcert 1;
}
if ($isRedcert != 1) {
rewrite ^(/.*)$ https://$host$1 permanent;
}
# HTTP_TO_HTTPS_END
- 逻辑:请求端口不是443时,会强制跳转至443。
新规则【更改后】
# HTTP_TO_HTTPS_START
# 增加8443端口豁免
if ($server_port !~ (443|8443)) {
rewrite ^(/.*)$ https://$host$1 permanent;
}
# HTTP_TO_HTTPS_END
或
# HTTP_TO_HTTPS_START
set $isRedcert 1;
# 增加8443端口豁免
if ($server_port != (443|8443)) {
set $isRedcert 2;
}
if ($uri ~ /\.well-known/) {
set $isRedcert 1;
}
if ($isRedcert != 1) {
rewrite ^(/.*)$ https://$host$1 permanent;
}
# HTTP_TO_HTTPS_END
- 逻辑:请求端口不是443或8443时,会强制跳转至443。
- 优点:增加端口豁免,443和8443端口不会强制跳转,保持了对多端口的支持。
解决方案
临时方法
- 说明:新增了对 8443 的支持,避免 8443 被强制跳转。
- 手动更改网站的 nginx 配置文件:
- 找到 nginx 配置文件路径(宝塔面板中:网站管理 -> 设置 -> 配置文件)。
- 根据对应原始规则更改为上面提到的新规则,此方法在重新部署证书或重新打开【强制HTTPS】后会被覆盖配置。
永久方法
- 修改宝塔面板的内置规则,虽然部署证书和强制HTTPS不会覆盖配置,但是面板更新后会对更改的.py进行覆盖,尽量避免更新。
- 备份以下文件,避免修改出错:
cp /www/server/panel/mod/project/docker/sites/sslManage.py
/www/server/panel/mod/project/docker/sites/sslManage.py.bak
cp /www/server/panel/mod/project/docker/sites/base.py /www/server/panel/mod/project/docker/sites/base.py.bak
cp /www/server/panel/mod/project/proxy/comMod.py /www/server/panel/mod/project/proxy/comMod.py.bak
- 修改 sslManage.py 文件
- 路径:/www/server/panel/mod/project/docker/sites/sslManage.py,找到 525:527 行,修改规则为:
if ($server_port != (443|8443)) { set $isRedcert 2; }
- 修改 base.py 文件
- 路径:/www/server/panel/mod/project/docker/sites/base.py找到 158 行,修改规则为:
"force_conf": " #HTTP_TO_HTTPS_START\n set $isRedcert 1;\n if ($server_port != (443|8443)) {\n set $isRedcert 2;\n }\n if ( $uri ~ /\.well-known/ ) {\n set $isRedcert 1;\n }\n if ($isRedcert != 1) {\n rewrite ^(/.*)$ https://$host$1 permanent;\n }\n #HTTP_TO_HTTPS_END",
- 修改 comMod.py 文件
- 路径:/www/server/panel/mod/project/proxy/comMod.py,找到 54 行,修改规则为:
"force_conf": " #HTTP_TO_HTTPS_START\n set $isRedcert 1;\n if ($server_port != (443|8443)) {\n set $isRedcert 2;\n }\n if ( $uri ~ /\.well-known/ ) {\n set $isRedcert 1;\n }\n if ($isRedcert != 1) {\n rewrite ^(/.*)$ https://$host$1 permanent;\n }\n #HTTP_TO_HTTPS_END",
- 重启宝塔服务
bt restart
我还没用过宝塔面板咧,都是在直接在服务器里一顿嚯嚯