带有 url 重写的 HTTPS 反向代理

Posted

技术标签:

【中文标题】带有 url 重写的 HTTPS 反向代理【英文标题】:HTTPS reverse proxy with url rewrite 【发布时间】:2019-08-27 03:26:44 【问题描述】:

我想在我的家庭服务器上安装 Nextcloud。 Nextcloud 快照将始终将 Nextcloud 实例放在 /,假设为 https://myserver.ddns.com。但我也想从我的服务器https://myserver.ddns.com/otherstuff/ 提供其他网页,所以我想将 Nextcloud 移动到https://myserver.ddns.com/nextcloud/。

似乎这可以通过使用带有 URL 重写的反向代理的 HTTP 服务器来完成,即我在端口 81 上运行 Nextcloud snap,反向代理透明地路由 https://myserver.ddns.com/nextcloud/ -> https://myserver.ddns.com:81/。

但我不想将未加密的 Nextcloud 实例暴露给互联网。是否可以为 HTTPS 实例执行此 URL 重写?它需要代理读取 HTTPS 请求,但透明的反向代理不应该能够解密通信?

替代方案当然是手动安装 Nextcloud,但 snap 承诺更容易维护和配置,由比我更了解这些东西的人编写。

【问题讨论】:

【参考方案1】:

通过让反向代理终止 SSL 连接并将未加密的转发到 Nextcloud 服务器来解决此问题。然后代理可以重写 URL。 Nextcloud 也必须被告知它在一个 url-rewriting 反向代理后面。

对于 nextcloud snap,您可以使用以下命令(来自https://github.com/nextcloud/nextcloud-snap/wiki/Putting-the-snap-behind-a-reverse-proxy#nginx-optional-custom-path-location-for-reverse-proxy):

$ nextcloud.occ config:system:set overwritehost --value="myserver.ddns.com"
$ nextcloud.occ config:system:set overwriteprotocol --value="https"
$ nextcloud.occ config:system:set overwritewebroot --value="/nextcloud"
$ nextcloud.occ config:system:set overwrite.cli.url --value="https://myserver.ddns.com/nextcloud"

或者您可以直接在 Nextcloud config.php 中编辑这些值。

上面的链接没有解释 Apache 的设置,但下面的工作:

ProxyPass       "/nextcloud" "http://127.0.0.1:8000"
ProxyPassReverse "/nextcloud" "http://127.0.0.1:8000"
ProxyPass "/" "http://127.0.0.1:8001/"
ProxyPassReverse  "/" "http://127.0.0.1:8001/"

其中 8001 端口是静态/其他文件的网络服务器。 出于某种我不明白的原因,尾部斜杠很重要:如果我添加尾部斜杠:

ProxyPass       "/nextcloud" "http://127.0.0.1:8000/"

然后我被重定向了,但 Nextcloud 无法正常工作,如果我将其从静态重定向中删除:

ProxyPass "/" "http://127.0.0.1:8001"

然后myserver.ddns.com/foo 在内部被重定向到http://127.0.0.1:8001foo,这显然不起作用。

【讨论】:

以上是关于带有 url 重写的 HTTPS 反向代理的主要内容,如果未能解决你的问题,请参考以下文章

nginx配置详解-url重写反向代理负载均衡

所有站点的“/api/”文件夹的 IIS 反向代理/全局 URL 重写

反向代理将 url 重定向到子域

使用反向代理的 IIS URL 重写规则 - HTTP 错误 500.52

Nginx 反向代理负载均衡页面缓存URL重写及读写分离具体解释

nginx_3_反向代理负载均衡缓存URL重写