我正在为NGinx使用以下configuration来testing我的应用程序:
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 ”。 任何人都可以告诉我一个方法如何做同样的工作,而不使用“如果”?
而且,我用“如果”是越野车吗?
就nginx而言,“if is evil”有两个原因。 一个是,互联网上发现的许多howtos将直接翻译htaccess重写规则成一系列的ifs,当单独的服务器或地点将是一个更好的选择。 其次,nginx的if语句并不像大多数人所期望的那样。 它的行为更像一个嵌套的位置,有些设置不像您所期望的那样继承。 它的行为在这里解释。
也就是说,检查cookie等事情必须用ifs来完成。 只要确保你阅读和理解如何工作(特别是关于指令继承),你应该没问题。
您可能需要重新思考代理cookie中设置的任何主机。 也许结合cookie与地图来限制后端。
编辑:如果你使用名称,而不是IP地址在ID cookie中,你还需要一个解析器定义,所以Nginx可以查找后端的地址。 此外,您的默认proxy_pass将请求附加到setUserCookie的末尾。 如果您想要正确代理该网址,请将该默认proxy_pass替换为:
rewrite ^ /index.php/setUserCookie break; proxy_pass http://localhost:99;