我让 nginx 作为托管在另一台虚拟机上的 apache 上的 nextcloud 服务器的反向代理运行。我希望能够通过 cloud.example.com 访问它。根据我当前的规则,我必须输入 cloud.example.com/nextcloud。我已经用 Google 搜索过,最接近的结果是能够访问 cloud.example.com,它会重定向到 cloud.example.com/nextcloud,但如果可能的话,我想将 /nextcloud 排除在地址栏之外。除了 / 之外,我是否需要有一个 /nextcloud 位置来进行代理传递?
这是我当前的 nginx.conf:
server {
listen 443 ssl http2 default_server;
server_name _;
ssl_certificate /etc/letsencrypt/live/cloud.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cloud.domain.com/privkey.pem;
ssl_stapling on;
ssl_stapling_verify on;
location /.well-known {
alias /var/www/.well-known;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-By $server_addr:$server_port;
proxy_set_header Host $http_host;
proxy_pass http://10.37.70.6:8080;
}
}
答案1
要/nextcloud
避开地址栏,就需要if statements
使用显然是邪恶的。
问题是你需要评估 http 请求是否/nextcloud
在开头包含,因为这会改变你的代理请求,因为 apache 服务器需要 /nextcloud
位于 URL 中。此外,如果您确实希望将其从地址栏中删除,您还必须检查响应,因为 apache 服务器将包含包含 的链接/nextcloud
。
似乎最好的办法是重新配置 apache 服务器,使其不需要/nextcloud
,或者只是简单地告诉 nginx 重定向/
到 ,/nextcloud
正如您已经知道的那样。这对用户来说很简单,因为他/她只需要记住域名cloud.domain.com
答案2
这里的问题不是配置。问题在于后端 Apache 服务器提供的内容。链接和资源引用包含路径/nextcloud/
。在将内容呈现给用户/客户端之前,需要替换它。这并不总是一个可靠的解决方案:
location / {
sub_filter '/nextcloud/' '/';
sub_filter_once off;
proxy_pass http://10.37.70.6:8080/nextcloud/;
}
location /nextcloud/ {
rewrite ^/nextcloud(/.*)$ $1 redirect;
}