我的 NGINX 配置出现了问题,if
重定向域流量的特定条件似乎没有按预期工作。我的目标是将流量重定向到sub1.otherdomain.com
同一台服务器上在端口 3001 上运行的特定服务,但这似乎没有发生。总是返回 403;
我已确认 DNS 设置正确,因为sub1.otherdomain.com
NGINX 日志中显示了来自 的请求。我还尝试简化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/
具体来说,看看他们指出的第一个例子。在我看来,你的反向代理配置也发生了同样的事情
尝试“如何替代”部分中提到的方法