带有 proxy_pass 的 NGINX 子域名

带有 proxy_pass 的 NGINX 子域名

我让 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;
    }

这需要ngx_http_sub_module

相关内容