网站首页 文章专栏 nextcloud-onlyoffice-反向代理https错误排查
nextcloud-onlyoffice-反向代理https错误排查
创建于:2019-07-29 17:41:55 更新于:2024-11-24 06:02:04 羽瀚尘 2638
网站

背景

使用三台机器搭建nextcloud + onlyoffice: 树莓派:反向代理 蜗牛星际:nextcloud 淘汰笔记本:onlyoffice

三台笔记本之间使用openvpn连接在一起,协议是http;树莓派对外提供https访问能力。

nextcloud https访问没有问题,但是在nextcloud中点击文档跳转后出现Requests to the server have been blocked by an extension. 2348

排查与解决

F12查看控制台,发现错误

Refused to frame 'http://onlyoffice.stackoverflow.club/' because it violates the following Content Security Policy directive: "frame-src https://onlyoffice.stackoverflow.club/".

该错误似乎是因为在https iframe中访问http资源引起的,接着查到请求者为onlyoffice的api.js。看上去似乎是onlyoffice内部的api.js不够智能,不能自动从http转到https.

Onlyoffice - requests to the server have been blocked by an extension处看到对反向代理实现https onlyoffice的conf文件添加了一些headers;在使用 Docker 搭建 Onlyoffice 如此轻松愉快中对nginx的设置出也出现了X-Forwarded-Proto.

随后,在自己的配置文件中添加该header,问题解决。下面是完整的apache2 conf文件

<IfModule mod_ssl.c>
<VirtualHost *:443>

        ServerName onlyoffice.stackoverflow.club

        ServerAdmin wenfengand@gmail.com
        ProxyPass / http://10.8.0.6/
        ProxyPassReverse / http://10.8.0.6/




        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined


        LogFormat "%h\",\"%{User-agent}i\",\"%r\",\"%>s\",\"%B" apacheguilogholder
        CustomLog "|\"/usr/bin/java\" -jar \"/home/ubuntu/download/ApacheGUI/tomcat/bin/LogParser.jar\" \"/home/ubuntu/download/ApacheGUI/tomcat\"" apacheguilogholder

RequestHeader set X-Forwarded-Proto "https"
SSLCertificateFile /home/pi/workspace/onlyoffice.stackoverflow.club/fullchain.pem
SSLCertificateKeyFile /home/pi/workspace/onlyoffice.stackoverflow.club/privkey.pem
Include /home/pi/workspace/onlyoffice.stackoverflow.club/options-ssl-apache.conf
</VirtualHost>
</IfModule>

其他命令

  • 查看apache2已经加载的模块
apachectl -t -D DUMP_MODULES

原理

X-Forwarded-Proto (XFP) 是一个事实上的标准首部,用来确定客户端与代理服务器或者负载均衡服务器之间的连接所采用的传输协议(HTTP 或 HTTPS)。在服务器的访问日志中记录的是负载均衡服务器与服务器之间的连接所使用的传输协议,而非客户端与负载均衡服务器之间所使用的协议。为了确定客户端与负载均衡服务器之间所使用的协议, X-Forwarded-Proto 就派上了用场。

猜测api.js根据这个头部信息确定发出http请求还是https请求。