NGinx: как проверить, установлен ли файл cookie или нет, не используя "если"?
Я использую следующую конфигурацию для NGinx в настоящее время для тестирования моего приложения :
location / {
# see if the 'id' cookie is set, if yes, pass to that server.
if ($cookie_id){
proxy_pass http://${cookie_id}/$request_uri;
break;
}
# if the cookie isn't set, then send him to somewhere else
proxy_pass http://localhost:99/index.php/setUserCookie;
}
но они говорят:"IFisEvil". Может ли кто-нибудь показать мне, как делать ту же работу, не используя "если"?
А также, является ли мое использование "если" багги?
1 ответов
есть две причины, почему "если это зло", Что касается nginx. Во-первых, многие howtos, найденные в интернете, будут напрямую переводить правила перезаписи htaccess в серию ifs, когда отдельные серверы или местоположения будут лучшим выбором. Во-вторых, оператор if nginx ведет себя не так, как большинство людей ожидают. Он действует больше как вложенное местоположение, и некоторые настройки не наследуются, как вы ожидаете. Его поведение объясняется здесь.
что сказал, проверка таких вещей, как печенье, должна быть сделана с помощью ifs. Просто убедитесь, что Вы читаете и понимаете, как работает ifs (особенно в отношении наследования директив), и вы должны быть в порядке.
вы можете переосмыслить слепое проксирование на любой хост, установленный в файле cookie. Возможно, объединить cookie с карта для ограничения бэкэндов.
EDIT: если вы используете имена вместо ip-адресов в файле cookie id, вам также понадобится определитель, чтобы nginx мог искать адрес backend. Кроме того, ваш proxy_pass по умолчанию добавит запрос в конец setUserCookie. Если вы хотите прокси-сервер именно для этого url-адреса, вы заменяете этот proxy_pass по умолчанию на:
rewrite ^ /index.php/setUserCookie break;
proxy_pass http://localhost:99;