7

https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/を読み ました

Rails アプリケーションに既にヘッダー ( Access-Control-Allow-Origin) が追加されているかどうかを確認し、まだ追加されていない場合はヘッダーを追加したいと考えています。

ここの例ではif、nginx.conf http://agentzh.blogspot.in/2011/03/how-nginx-location-if-works.htmlの条件の動作を説明しようとしました。

しかし、私はそれを理解していません。私が持っている質問の 1 つは、指令またはフェーズ指令と言うとき、何を意味するのかということです。

私は自分でいくつかのことを試しました。お気に入り:

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のような命令が実行されているかどうかを確認したいと思います。

4

1 に答える 1

9

私はあなたのコードをテストしていません。私は経験からのみ話します!!!

まず、Nginx の構成が OOP の動作 (オブジェクト指向プログラミング) とまったく似ていないことを指定させてください。それは、ひと言でいうと「Declarative」としか言いようがありません。

意味...同じブロックに2つのIFステートメントがあり、両方が基準を満たす場合、2番目のみが優先されて実行されます。

1 つの if と、同じブロック内の以前のすべての宣言でも同じことが起こります。一部の変数 (すべてではない) は IF の存在により実行されず、nginx はそれらが内部で再宣言されることを期待しています。これはあなたの例で起こります。分かりやすくするために、2 つ目を見てみましょう。ロケーション ブロック内で、いくつかのヘッダー値を宣言します。しかし、IFステートメントが満たされると、それらは実行されません(IFは実際にnginxでは悪です)。完全に実行するには、ほとんどのヘッダー変数を if ステートメントの内側と if ステートメントの外側で再宣言する必要があるため、if ステートメントが満たされた場合にそれらが実行されます。注、nginx の IF によって影響を受けるすべての変数をリストするマップはありません。エラーがないかどうか conf をテストする必要があります。一部の変数は再宣言する必要がなく、この場合、nginx は再起動時にエラーを報告します。どれかを判断する唯一の方法は、報告された誤ったものをすべて除外することです。

提案

a) 可能であれば、nginx で IF を避けます。代わりにロケーション ブロックを使用してください。たとえば、特定のファイルに Access-Control-Allow-Origin のようなヘッダー変数を追加するだけの場合は、if を使用せず、代わりに 2 番目のロケーション ブロックを使用します (以下を参照)。

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

b) IF が必須の場合は、注意して使用し、テスト テスト テストを行ってください。上記のように、if ステートメントですべてを再宣言することをお勧めします (上記で提案したように、再宣言が構成を壊すものをテストして除外します)。

幸運を。

于 2016-02-07T21:02:59.060 に答える