一、问题现象

部署结构如下:

  • 源站仅监听 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 源站配置。


五、架构原则

在反向代理结构中应遵循:

  1. TLS 在边缘终止
  2. 源站保持纯 HTTP
  3. 不在源站强制 overwriteprotocol
  4. 通过 trusted_proxies 识别真实客户端协议

错误模式:

源站未启用 443,却强制 overwriteprotocol=https

正确模式:

由反代传递 HTTPS 头部,源站根据头部识别协议

六、结论

本次问题并非防火墙、监听端口或域名信任问题。

根因仅为:

'overwriteprotocol' => 'https'

删除该配置后,局域网与外网访问逻辑一致,架构恢复自洽。

Leave a Reply

Your email address will not be published. Required fields are marked *