NGINX 配置问题:特定子域名未正确重定向

NGINX 配置问题:特定子域名未正确重定向

我的 NGINX 配置出现了问题,if重定向域流量的特定条件似乎没有按预期工作。我的目标是将流量重定向到sub1.otherdomain.com同一台服务器上在端口 3001 上运行的特定服务,但这似乎没有发生。总是返回 403;

我已确认 DNS 设置正确,因为sub1.otherdomain.comNGINX 日志中显示了来自 的请求。我还尝试简化if语句中的正则表达式,但无济于事。

基本上,我有一个 api 服务器 (apidomain.com),并且 nginx 在该服务器上运行。我只想将请求传递给在相关端口上运行的应用程序。如果请求来自,sub1.otherdomain.com则传递到端口 3001。如果请求来自,sub2.otherdomain.com则传递到端口 3002。如果两者都不是,则返回 403。

我的NGINX配置:

    server {
    listen 443 ssl;
    server_name apidomain.com;

    ssl_certificate /home/ubuntu/ssl/apidomaincert.crt;
    ssl_certificate_key /home/ubuntu/ssl/apidomainprivate.key;

    location / {

        set $allowed_domain 0;

        if ($http_host ~* "sub1\.otherdomain\.com") {
            set $allowed_domain 1;
            proxy_pass http://127.0.0.1:3001;
        }

        if ($http_host ~* "sub2\.otherdomain\.com") {
            set $allowed_domain 1;
            proxy_pass http://127.0.0.1:3002;
        }

        if ($allowed_domain = 0) {
            return 403; # Unauthorized
        }

        proxy_http_version 1.1;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }
}

我也尝试过,但来自两个子域的所有请求都发送到同一个端口 3001。

server {
    listen 443 ssl default_server;
    server_name _;

    ssl_certificate /home/ubuntu/ssl/apidomaincert.cert;
    ssl_certificate_key /home/ubuntu/ssl/apidomainprivate.key;

    return 403;
}

server {
    listen 443 ssl;
    server_name sub1.otherdomain.com;
    ssl_certificate /home/ubuntu/ssl/cert.apidomaincert;
    ssl_certificate_key /home/ubuntu/ssl/apidomainprivate.key;

    location / {
        proxy_pass http://127.0.0.1:3001;
    }
    proxy_http_version 1.1;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
}

server {
    listen 443 ssl;
    server_name sub2.otherdomain.com;

    ssl_certificate /home/ubuntu/ssl/apidomaincert.cert;
    ssl_certificate_key /home/ubuntu/ssl/apidomainprivate.key;

    location / {
        proxy_pass http://127.0.0.1:3002;
    }
    proxy_http_version 1.1;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
}

答案1

为了扩展理查德的评论,这是在 nginx 中处理多个域的最佳实践。

# Catch-all domain which returns 403 to all requests if no other server block matches
server {
    listen 443 ssl default_server;
    server_name _;

    ssl_certificate /path/to/key/for/default; # In this case this could be for apidomain.com
    ssl_certificate_key /path/to/cert/for/default;

    return 403;
}

server {
    listen 443 ssl;
    server_name sub1.example.com;
    ssl_certificate /path/to/key/for/sub1;
    ssl_certificate_key /path/to/cert/for/sub1;

    location / {
        proxy_pass http://127.0.0.1:3001;
    }
    ...
}

server {
    listen 443 ssl;
    server_name sub2.example.com;
    ssl_certificate /path/to/key/for/sub2;
    ssl_certificate_key /path/to/cert/for/sub2;

    location / {
        proxy_pass http://127.0.0.1:3002;
    }
    ...
}

最好if尽可能避免使用,因为它可能并不总是如预期的那样工作。

答案2

我对 Nginx 没有太多经验,但我认为你的配置与下面文章中提到的配置非常相似,其中指出在某个位置使用 if 子句可能不是一个好主意

https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

具体来说,看看他们指出的第一个例子。在我看来,你的反向代理配置也发生了同样的事情

尝试“如何替代”部分中提到的方法

相关内容