一、问题现象
部署结构如下:
- 源站仅监听 80(不启用本地 HTTPS)
- 反向代理监听 443,对外提供 HTTPS
- 局域网直接访问源站 IP(HTTP)
外网访问正常,局域网访问 http://内网IP/nextcloud/ 时出现异常:
- 自动跳转至
https://内网IP/... - 源站未监听 443,连接失败
- 客户端无法进入登录页
curl 复现:
Location: https://192.168.x.x/nextcloud/index.php/login
curl: (7) Failed to connect to 192.168.x.x port 443
二、问题根因分析
config.php 中存在如下配置:
'overwriteprotocol' => 'https',
该配置会:
- 强制所有请求协议视为 HTTPS
- 无视当前真实访问协议
- 对所有入口统一重定向为 https://
在源站未启用 443 的情况下,任何 HTTP 请求都会被强制跳转至 HTTPS,从而导致局域网访问失败。
本质问题:
源站未提供 TLS,却强制协议为 HTTPS。
属于架构与配置不匹配。
三、解决方案
删除或注释:
'overwriteprotocol' => 'https',
保留:
'overwrite.cli.url' => 'https://example.com/nextcloud',
更新重写规则并重载 Web 服务:
sudo -u www-data php occ maintenance:update:htaccess
systemctl reload apache2
修复后验证:
curl -IL http://内网IP/nextcloud/
应返回:
Location: http://内网IP/nextcloud/index.php/login
HTTP/1.1 200 OK
局域网访问恢复正常。
四、反向代理标准配置建议
1. trusted_domains
'trusted_domains' =>
array (
0 => '内网IP',
1 => '外网域名',
),
2. trusted_proxies
'trusted_proxies' =>
array (
0 => '反代机内网IP',
),
用于信任反代传递的 X-Forwarded-* 头部。
3. HSTS 策略
HSTS 应仅在 HTTPS 终端(反代机)启用,不应在纯 HTTP 源站配置。
五、架构原则
在反向代理结构中应遵循:
- TLS 在边缘终止
- 源站保持纯 HTTP
- 不在源站强制 overwriteprotocol
- 通过 trusted_proxies 识别真实客户端协议
错误模式:
源站未启用 443,却强制 overwriteprotocol=https
正确模式:
由反代传递 HTTPS 头部,源站根据头部识别协议
六、结论
本次问题并非防火墙、监听端口或域名信任问题。
根因仅为:
'overwriteprotocol' => 'https'
删除该配置后,局域网与外网访问逻辑一致,架构恢复自洽。