Рейтинг:0

Переписать строку запроса Nginx

флаг cn

У меня есть конфигурация, как показано ниже, но я получаю ошибку 500. Где может быть эта ошибка?

вышестоящие главные серверы {сервер 192.168.1.1:8000;}
восходящие подчиненные серверы {сервер 192.168.1.2:8001;}

карта $request_uri $redirect_to {
    мастер-серверы "target=master";
    подчиненные серверы "цель=подчиненный";
}

сервер {
    слушать 80;
        имя_сервера 192.168.1.10;

       место расположения / {
        proxy_pass http://$redirect_to;
    }

}

Когда я вызываю URL-адрес, как показано ниже, я получаю следующую ошибку.

http://192.168.1.10/app/index.html?target=мастер

http://192.168.1.10/app/index.html?target=slave

Журнал Nginx: *2 недопустимый префикс URL-адреса в «http://», клиент: 192.168.1.11, сервер: 192.168.1.10, запрос: «GET /favicon.ico HTTP/1.1», хост: «192.168.1.10», реферер: «http ://192.168.1.10/app/index.html?target=мастер"

Рейтинг:0
флаг gr

Вы сравниваете свои $request_uri, что равно /app/index.html?target=мастер из вашего примера, чтобы цель = мастер и цель=раб струны. Ни один не совпал, так что $redirect_to переменная становится пустой строкой. Если вы хотите проверить, $request_uri содержит цель = мастер или же цель=раб подстроки, вы можете использовать шаблоны регулярных выражений внутри карта блокировать:

карта $request_uri $redirect_to {
    главные серверы "~target=master";
    подчиненные серверы "~target=slave";
}

или лучше проверить $arg_target переменное значение:

карта $arg_target $redirect_to {
    главные главные серверы;
    подчиненные подчиненные серверы;
}

Также рассмотрите возможность использования некоторых По умолчанию значение, когда нет цель Аргумент запроса указан в запросе (или его значение неверно):

карта $arg_target $redirect_to {
    главные главные серверы;
    подчиненные подчиненные серверы;
    мастер-серверы по умолчанию;
}

Последнее можно упростить до

карта $arg_target $redirect_to {
    подчиненные подчиненные серверы;
    мастер-серверы по умолчанию;
}

Или сделайте предварительную проверку, например

карта $arg_target $redirect_to {
    главные главные серверы;
    подчиненные подчиненные серверы;
}
сервер {
    слушать 80;
    имя_сервера 192.168.1.10;

    если ($redirect_to = '') {
        вернуть 501; # HTTP 501 не реализован
    }

    место расположения / {
        proxy_pass http://$redirect_to;
    }

}

Обновлять

Если я правильно понимаю ваш дополнительный вопрос - как загрузить все активы из того же восходящего потока, что и основной HTML-файл, - вы можете попытаться получить имя восходящего потока из HTTP Реферер значение заголовка, если цель Аргумент запроса отсутствует с использованием двух цепочек карта блоки (здесь действительно нужны регулярные выражения):


карта $arg_target $redirect_to {
    главные главные серверы;
    подчиненные подчиненные серверы;
    по умолчанию $by_referer;
}
карта $http_referer $by_referer {
    главные серверы "~target=master";
    подчиненные серверы "~target=slave";
}
сервер {
    ...
}
MrTux01 avatar
флаг cn
Спасибо за отличное объяснение. Как я могу избавиться от ошибки 500 для файлов css и js?
Ivan Shatsky avatar
флаг gr
Не уверен, правильно ли я понимаю ваш вопрос, если да, проверьте обновление до ответа.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.