Nginx

nginx:為什麼我不能將 proxy_set_header 放在 if 子句中?

  • May 12, 2013

使用此配置:

server {
   listen 8080;
   location / {
       if ($http_cookie ~* "mycookie") {
           proxy_set_header X-Request $request;
           proxy_pass http://localhost:8081;
       }
   }
}

重新載入 nginx 服務時出現此錯誤:

Reloading nginx configuration: nginx: [emerg] "proxy_set_header" directive is not allowed here in /etc/nginx/conf.d/check_cookie.conf:5
nginx: configuration file /etc/nginx/nginx.conf test failed

此配置工作正常,但它不符合我的要求:

server {
   listen 8080;
   location / {
       proxy_set_header X-Request $request;
       if ($http_cookie ~* "mycookie") {
           proxy_pass http://localhost:8081;
       }
   }
}

為什麼我不能將proxy_set_header指令放在 if 子句中?

假設您實際上是想問,“我怎樣才能讓它工作”,那麼只需重新編寫以便始終傳遞標頭,但如果您不想設置它,請將其設置為某個忽略的值。

server {
   listen 8080;    
   location / {
       set $xheader "someignoredvalue";

       if ($http_cookie ~* "mycookie") {
           set $xheader $request;
       }

       proxy_set_header X-Request $xheader;

       if ($http_cookie ~* "mycookie") {
           proxy_pass http://localhost:8081;
       }
   }

‘If’ 在 nginx 配置中通常是一個不好的做法。您可以使用地圖模組使事情正常進行。見http://nginx.org/en/docs/http/ngx_http_map_module.html http://wiki.nginx.org/HttpMapModule

引用自:https://serverfault.com/questions/506972