
Мне нужен способ перенаправлять клиентов, когда не определен существующий путь. Когда я вставляю конфигурацию return 301, nginx, похоже, игнорирует любые конфигурации местоположения. Он перенаправляет все.
Имя хоста в перенаправлении должно быть динамическим (приходить от клиента). Эти серверы на самом деле являются контейнерами и развертываются в средах Dev/Prod. Поэтому URL-адрес клиента меняется с чего-то вроде dev.example.com на example.com. Я бы предпочел не делать подкачку конфигурации на основе сред.
Я использую v1.18 на RHEL. Проксируемые серверы — это приложения 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/;
}
}