Как перенаправить определенное местоположение на это местоположение в другом домене?

#redirect #nginx #nginx-location

#перенаправление #nginx #nginx-местоположение

Вопрос:

Итак, у меня есть виртуальный хост, определенный в nginx, который должен перенаправлять на два разных домена. Любой используемый URL domain-x.com -адрес должен перенаправляться на domain-a.com , но domain-x.com/info точно должен перенаправляться на domain-b.com/info . Я пробовал это двумя разными способами.

Обычно моя запись выглядит так:

 server {
    listen 80;
    server_name domain-x.com www.domain-x.com;

    location ...

    return 307 $scheme://domain-a.com$request_uri;
}
 

Это несколько затрудняет общее перенаправление domain-x.com . Для location я попробовал перенаправление двумя способами:

 location /info/ {
    return 307 $scheme://domain-b.com/info;
}
 

и:

 location /info/ {
    proxy_pass http://domain-b.com/;
}
 

Я также пробовал это location = /info/ безрезультатно.

Проблема, с которой я сталкиваюсь, заключается в том, что любой подобный URL domain-x.com/something перенаправляется на [IP]something (IP-адрес — это адрес сервера, на котором работает nginx), и это также относится к /info тому, который заканчивается как [IP]info . Когда я вхожу [IP]/info , перенаправление работает так, как ожидалось. Не могли бы вы помочь мне разобраться в моих проблемах, пожалуйста?

Ответ №1:

Основная проблема заключается в том, что голый возврат в server блоке переопределяет любые location блоки на том же уровне.

Либо защитите значение по умолчанию return , обернув его внутри location блока по умолчанию, чтобы все блоки местоположения были оценены правильно. Например:

 server {
    listen 80;
    server_name domain-x.com www.domain-x.com;

    location / {
        return 307 $scheme://domain-a.com$request_uri;
    }
    location = /info {
        return 307 $scheme://domain-b.com/info;
    }
}
 

Или используйте a rewrite перед return as, поскольку эти директивы оцениваются по порядку. Например:

 server {
    listen 80;
    server_name domain-x.com www.domain-x.com;

    rewrite ^/info$ $scheme://domain-b.com/info redirect;
    return 307 $scheme://domain-a.com$request_uri;
}
 

Конечно, во втором примере используется ответ 302, а не желаемый ответ 307.

В обоих примерах я предположил точное совпадение /info URI, но оба легко модифицируются для принятия /info в качестве префикса.

Смотрите Это и это для получения более подробной информации.

Комментарии:

1. Я попробовал оба ваших решения, и они дали мне тот же результат: [IP]info/ на этот раз с косой чертой в конце. Я начинаю задаваться вопросом, мешают ли другие настройки, хотя я отключил все другие виртуальные хосты.

2. Я бы посоветовал вам попробовать подключаемый модуль / инструменты для браузера, чтобы проанализировать Location заголовок в HTTP-ответе и точно определить, какой сервер возвращает IP-адрес, а не доменное имя.

3. Надо было использовать curl раньше… Вы были правы, подозревая, что целевой сервер создает проблемы.