当前位置: 首页 > news >正文

Nginx 代理 OnlyOffice 时 URL 端口丢失问题 - Higurashi

引言

在使用 Nginx 作为反向代理服务 OnlyOffice 时,发现原本应为https://ip:port/cache/...的请求,在经过 Nginx 代理后,变成了https://ip/cache/...

问题描述

当 Nginx 配置如下代理 OnlyOffice 请求时:

location ~* /(8.3.0-|web-apps|cache/files) {# OnlyOffice 容器的地址和端口proxy_pass http://192.168.1.186:8050;# 设置必要的头信息proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# WebSocket 支持(OnlyOffice 协作编辑依赖)proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header X-Frame-Options "SAMEORIGIN";# 超时设置proxy_connect_timeout 7d;proxy_send_timeout 7d;proxy_read_timeout 7d;send_timeout 7d;# 缓冲设置proxy_buffering off;
}

观察到正常应该对https://ip:port/cache/files/data/3564657e6e/Editor.bin/Editor.bin?...的请求,在实际访问时,端口号被移除,变为https://ip/cache/files/data/3564657e6e/Editor.bin/Editor.bin?...。导致 OnlyOffice 编辑器无法下载文件并回显。

问题分析

此问题的根本原因在于 OnlyOffice 服务在生成重定向或资源链接时,依赖于请求头中的Host和协议信息来构造返回的 URL。尽管 Nginx 配置中包含了proxy_set_header Host $host;,但$host变量在某些情况下并不包含端口号,从而导致后端服务生成的 URL 缺少端口。

具体来说:

  • $host变量的行为
    • $host变量优先取自客户端请求头中的Host字段。
    • 如果客户端请求头中包含端口(例如Host: example.com:8443),则$host会包含端口。
    • 然而,如果客户端通过域名访问且使用标准端口(如 HTTPS 的 443 端口),浏览器通常会省略Host头中的端口号(例如Host: example.com而非Host: example.com:443)。在这种情况下,Nginx 的$host变量也不会包含端口
  • OnlyOffice 的依赖:当 OnlyOffice 后端服务接收到Host: your-domain.com(不带端口)的请求头时,它会认为当前服务的访问地址不包含端口,因此在生成回调、资源链接或重定向 URL 时,也会省略端口,最终导致前端请求的 URL 丢失端口。

解决方案:强制在Host头中保留端口号

为解决此问题,需要确保传递给 OnlyOffice 后端的Host头中始终包含端口号,即使该端口是标准端口(如 443)。这可以通过修改 Nginx 的proxy_set_header Host指令来实现。

修改方式

将 Nginx 配置中的proxy_set_header Host $host; 修改为proxy_set_header Host $host:$server_port;

location ~* /(8.3.0-|web-apps|Editor.bin) {proxy_pass http://192.168.1.186:8050;# 关键修改:强制设置 Host 头,包含当前服务器监听的端口号proxy_set_header Host $host:$server_port;# 如果希望固定某个特定端口(例如 8443),也可以这样写:# proxy_set_header Host $host:8443;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# WebSocket 支持(OnlyOffice 协作编辑依赖)proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header X-Frame-Options "SAMEORIGIN"; # 允许嵌套# 超时设置proxy_connect_timeout 7d;proxy_send_timeout 7d;proxy_read_timeout 7d;send_timeout 7d;# 缓冲设置proxy_buffering off;
}

关键指令解释

下表详细解释了 Nginx 中与Host头相关的几个变量和指令:

指令/变量 说明
$host 通常是客户端请求头中Host字段的值。如果客户端请求的是标准端口(如 80 或 443),浏览器通常会省略端口,此时$host不包含端口
$http_host 等同于$host。在未设置Host请求头时,此变量可能为空。
$server_port Nginx 服务器当前监听的端口号。例如,如果 Nginx 监听 8443 端口,则$server_port的值为8443
proxy_set_header Host $host:$server_port; 推荐的解决方案。此指令强制将Host请求头设置为客户端请求的域名(或 IP)与 Nginx 监听端口的组合。这样,即使客户端请求的Host头不带端口,后端 OnlyOffice 服务也能收到完整的Host:Port信息,从而生成正确的带端口的 URL。

总结

OnlyOffice 在 Nginx 代理下出现 URL 端口丢失的问题,其核心在于 Nginx 的$host变量在某些情况下不包含端口信息,导致 OnlyOffice 后端生成了错误的资源链接。通过将proxy_set_header Host $host:$server_port; 添加到 Nginx 配置中,可以强制将完整的Host:Port信息传递给 OnlyOffice 后端,从而解决此问题。

http://www.sczhlp.com/news/52984/

相关文章:

  • 中国手表网站wordpress本地登录密码
  • 长春做网站设计渭南网站建设
  • 广州做网站哪家好公司如何创办公司
  • 南阳做网站优化网站建设总流程图
  • 怎么在word里做网站wordpress是哪种服务器
  • 网站做推广页需要什么软件有哪些互联网站建设机构
  • 加强学院网站的建设与管理家装公司排行榜
  • 那里建设网站好wordpress整合ck
  • 一个网站如何优化高校网站建设花费
  • 网站检测报告那里做行业网站建设运营
  • AI自主交互功能的大模型协同框架
  • 杭州网络排名优化网站产品优化
  • 站长工具欧美高清口子网站怎么做
  • 莆田网站建设莆田网站建设交流发言
  • 网站抓取诊断干煤棚网架公司
  • 网页设计网站名称织梦网站怎么做伪静态页面
  • 搜索词排行榜网站seo课程
  • 响应式网站设计稿wordpress文章发送代码块
  • 做网站数据库怎么做免费域名注册网站哪个好
  • 网站怎么添加百度地图太原百度关键词推广
  • 湖北网站设计制作开发成都网站优化最低价
  • 网站怎么做关键词搜索排面少主网络建站
  • 陕西住房城乡建设门户网站外贸网站建设十大标准
  • 2025.8.25至2025.8.30周总结
  • 我与我周旋,我与我和解。
  • 8.30总结
  • 网站广告条怎么做深圳龙岗个人网站建设
  • 黄岛网站建设公司首选局域网网站制作
  • c .net网站开发入门东莞网站建设制作价格
  • 深圳好的网站建设公司排名东莞网站设计方案