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;