if条件如何在nginx conf中的位置块内工作?

Abh*_*mar 6 nginx nginx-location

我已阅读 https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

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

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

但我没有理解它。我的问题之一是当他们说指令或阶段指令时是什么意思?

我自己尝试了一些东西。喜欢:

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 '**';
  }
}
Run Code Online (Sandbox Code Playgroud)

这里当满足 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 '**';
  }
}
Run Code Online (Sandbox Code Playgroud)

这里 $a 变量被设置为 1 但只有My-inner-header再次设置而不是My-outer-header.

我想检查并确保诸如此类的指令proxy_set_header是否正在执行。

小智 8

我还没有测试你的代码。我只是经验之谈!!!

首先,请允许我指定 Nginx 配置与任何 OOP 行为(面向对象编程)完全不同。它在一个词中不可预测地是“声明性的”。

含义...如果您在同一个块中有 2 个 IF 语句都满足条件,则只有第二个将占优势并被执行。

1 if 以及它在同一块中的所有先前声明也会发生同样的情况。由于IF的存在,一些变量(不是全部)不会被执行,nginx希望它们在里面重新声明。这发生在您的示例中。为了清楚起见,让我们看第二个。在您的位置块中,您声明了几个标头值。但是,当满足 IF 语句时,它们不会被执行(IF 在 nginx 中确实是邪恶的)。为了完全执行,您需要在 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 *;
}
Run Code Online (Sandbox Code Playgroud)

b) 在 IF 是强制性的情况下,请谨慎使用并测试测试测试。如上所述,在 if 语句中重新声明所有内容是一个很好的做法(如上所述,测试并排除任何重新声明破坏配置的情况)。

祝你好运。