系统相关
首页 > 系统相关> > 如果条件在Nginx conf中的位置块内如何工作?

如果条件在Nginx conf中的位置块内如何工作?

作者:互联网

我读过了
https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

我想检查我的Rails应用程序是否已经添加了标题(Access-Control-Allow-Origin),如果还没有,则添加标题.

此处的示例试图解释nginx.conf http://agentzh.blogspot.in/2011/03/how-nginx-location-if-works.html中if条件的行为.

但是我还不明白.我的问题之一是当他们说指令或阶段指令时意味着什么?

我自己尝试过一些东西.喜欢:

location / {
  add_header My-outer-header '*';
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_set_header X-NginX-Proxy true; 

  if($sent_http_access_control_allow_origin != /*){
    add_header My-inner-header '**';
  }
}

在这里,如果满足if条件,则仅设置My-inner-header,而不设置My-outer-header.

但是当我这样做时:

location / {
  add_header My-outer-header '*';
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_set_header X-NginX-Proxy true; 
  set $a 1;
  if($a == 1){
    add_header My-inner-header '**';
  }
}

这里$a变量设置为1,但仅再次设置了My-inner-header,而不设置了My-outer-header.

我想检查并确保是否执行了诸如proxy_set_header之类的指令.

解决方法:

我尚未测试您的代码.我只是根据经验说话!!!

首先,请允许我指定Nginx配置与任何OOP行为(面向对象编程)根本不相似.一言以蔽之,它是“声明性”的.

含义…如果同一块中有两个同时满足条件的IF语句,则仅以第二个为准并执行.

如果1及其所有先前的声明在同一块中,则情况相同.由于存在IF,某些变量(不是全部)将不会执行,nginx希望在其中重新声明它们.
这发生在您的示例中.为了清楚起见,让我们来看第二个.
在位置块内,您声明了几个标头值.但是,如果满足IF语句,则不会执行它们(如果nginx中的IF确实是邪恶的).为了获得完整的执行,您需要在if语句内部以及在if语句之外重新声明大多数头变量,然后在if语句内部再次声明,以便在满足if语句的情况下执行它们.注意,在nginx中没有映射列出受IF影响的所有变量,您应该测试我们的conf是否存在任何错误.一些变量将不需要重新声明,在这种情况下,nginx将在重启时报告错误.找出哪一个的唯一方法就是全力以赴,并排除报告的错误代码.

意见建议

a)尽可能避免在nginx中使用IF.请改用位置块.
例如如果您只想为某些文件添加诸如Access-Control-Allow-Origin之类的标头变量,则不要使用if,而是使用第二个位置块(请参见下文)

location / {
  // some code here
}
location ~* \.(eot|ttf|woff|woff2)${
    add_header Access-Control-Allow-Origin *;
}

b)如果必须使用IF,请谨慎使用并进行测试测试.如上所述,在if语句中重新声明所有内容都是一种好习惯(如上所述,请测试并排除任何重新声明都会破坏配置).

祝好运.

标签:nginx,nginx-location
来源: https://codeday.me/bug/20191027/1943989.html