我需要一种在未定义现有路径时重定向客户端的方法。当我输入返回 301 配置时,nginx 似乎会忽略任何位置配置。它会重定向所有内容。
重定向中的主机名需要是动态的(来自客户端)。这些服务器实际上是容器,部署到 Dev/Prod 环境中。因此客户端 URL 会从 dev.example.com 之类的内容更改为 example.com。我宁愿不根据环境进行配置交换。
我在 RHEL 上使用 v1.18。代理的服务器是各自开发人员管理的 Angular 应用程序。
server {
listen 80;
server_name _;
index index.html;
location = /service/a {
proxy_pass http://svc-a.local/service/a/;
}
location /service/a/ {
proxy_pass http://svc-a.local/service/a/;
}
location = /service/b {
proxy_pass http://svc-b.local/service/b/;
}
location /service/b/ {
proxy_pass http://svc-b.local/service/b/;
}
location = /service/x {
proxy_pass http://svc-x.local/service/x/;
}
location /service/x/ {
proxy_pass http://svc-x.local/service/x/;
}
location = /home {
proxy_pass http://home.local/home/;
}
location /home/ {
proxy_pass http://home.local/home/;
}
# kubernetes probes this, but fails getting 301
location /nginx_status {
stub_status on;
acccess_log off;
}
# IF NO MATCH FROM ABOVE THEN GO TO /HOME
# try #1
return 301 http://$host/home/;
# try #2
location = / {
return 301 http://$host/home/;
}
# try #3
return 301 /home/;
# try #4
location = / {
proxy_pass http://home.local/home/;
}
}
答案1
当规则return 301
位于任何位置块之外时,它将应用于整个服务器块并优先于位置块。您可以定义一个默认/后备位置块,如您的尝试 #2 中所示,但没有等号 ( =
)。等号指定精确匹配,而您需要前缀匹配,以便它匹配所有请求。
例如:
server {
listen 80;
server_name _;
index index.html;
location = /service/a {
proxy_pass http://svc-a.local/service/a/;
}
location /service/a/ {
proxy_pass http://svc-a.local/service/a/;
}
location /service/b/ {
proxy_pass http://svc-b.local/service/b/;
}
location = /service/x {
proxy_pass http://svc-x.local/service/x/;
}
location /service/x/ {
proxy_pass http://svc-x.local/service/x/;
}
location = /home {
proxy_pass http://home.local/home/;
}
location /home/ {
proxy_pass http://home.local/home/;
}
# kubernetes probes this, but fails getting 301
location /nginx_status {
stub_status on;
acccess_log off;
}
# IF NO MATCH FROM ABOVE THEN GO TO /HOME
location / {
return 301 http://$host/home/;
}
}