nginxは、upstream_http_変数を条件とするヘッダーを追加します


19

かなりの数のサイトをプロキシするnginxにリバースプロキシがあります。最近、SSL対応のすべてのWebサイトでHTTP Strict Transport Securityを有効にしました。これを有効にしたくないサイトが1つあります。

アップストリームがすでにStrict-Transport-Security-headerを送信しているかどうかを簡単に確認し、そうでない場合は追加します。そうすれば、私のアップストリームはmax-age=0、プロキシによってHSTSが有効にされないようにするためのSTSヘッダーを送信できます。

次のように構成を変更するだけだと思いました。

location / {
        proxy_pass http://webservers;

        proxy_redirect off;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto "https";

        if ($upstream_http_strict_transport_security = "") {
                add_header Strict-Transport-Security "max-age=15552000";
        }
}

しかし、おそらくが悪の場合、これは機能しません。変数が実際に存在することを確認するためにさまざまなことを試してみました(これが事実です)が、何も役に立たないようです。

どうすればこの作品を作ることができますか?

回答:


22

これは機能しません。リクエストがバックエンドに渡される前にifが評価されるため、$ upstream_http_変数にはまだ値がありません。値が空のadd_headerは無視されるため、マップを使用して条件付きでヘッダーを追加できます。

map $upstream_http_strict_transport_security $sts {
  '' max-age=15552000;
}

server {
  location / {
    add_header Strict-Transport-Security $sts;
  }
}

1
マップの巧妙な使用!
アレクセイ10年

わかりました。少し違うことをしようとしてきましたが、nginxを理解できませんでした。どこでnginxを正式に学ぶことができますか教えてください。そしてまた、あなたはここに私を助けることができる:serverfault.com/questions/678521/...
ムハンマドUmer

5

これifは、プロキシが実行される前に実行され、現時点ではvariableがないためです$upstream_http_strict_transport_security

header_filter_by_luaLuaモジュールのディレクティブを使用できます。例えば

header_filter_by_lua 'if not ngx.header["X-Test"] then ngx.header["X-Test"] = "blah" end';

1
これは動作します。Debian 7では、バックポートからNginxを使用して、LUAサポートを取得できますapt-get -t wheezy-backports install nginx-extras
ピーターエンヌ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.