nginx 多个站点,通过 URL 重定向

nginx 多个站点,通过 URL 重定向

假设我有几个用于监控后端服务的 Web UI 站点。

我希望它们可以通过 Web 访问(由 Auth 保护),但最好捆绑在一个子域下,并可通过各种 URL 访问,例如:

https://monitor.mydomain.com/my-service-monitor/

使用 nginx,如果我使用重写规则,例如

server {
    listen 443 ssl;
    server_name monitor.mydomain.com;
    # auth stuff here...

    location /my-service-monitor/ {
        rewrite                     ^/my-service-monitor(/.*)$ $1 break;
        proxy_pass                  http://my-service-monitor;
    }
} 

发生的情况是重定向有效,但由于所有静态内容都引用根 URL,因此它没有按预期显示(因为后端站点正在输出查看根 / url 的 HTML,而不是相对 URL monitor.mydomain.com/my-service-monitor/...

我该如何解决这个问题,或者有没有更简单的解决办法?(我可以使用多个子域名,但在我看来这会让外部曝光率太高)

我正在考虑重定向(返回 301 ...)到子域根 URL 但使用不同的端口,然后添加一个在该端口上监听代理到服务器的服务器块,但我觉得这会给身份验证带来麻烦。

任何见解都将不胜感激。

答案1

您需要教您的后端应用程序为页面生成正确的 URL。显然,有些人正在编写自定义 lua 代码来修改 nginx 中返回的 HTML,但老实说,我建议避免这样做,因为这太疯狂了。

答案2

我最终在同一个子域上为每个站点分配了不同的端口

问题是服务器块应该在 server_name 中包含端口。起初,我只有 listen 值列出端口,但它不适用于同一 server_name 上的多个站点,因此需要

server {
    listen       8000 ssl;
    server_name  sub-domain.domain.com:8000;
    #auth stuff
    location / {
        proxy_pass                  http://my-service-monitor1;
    }
}

server {
    listen       8001 ssl;
    server_name  sub-domain.domain.com:8001;
    #auth stuff
    location / {
        proxy_pass                  http://my-service-monitor2;
    }
}

相关内容