nginx menambahkan header yang tergantung pada variabel upstream_http_

19

Saya memiliki proxy terbalik pada nginx yang proksi beberapa situs. Saya baru-baru ini mengaktifkan Keamanan Transportasi HTTP Ketat untuk semua situs web yang mendukung SSL. Saya sekarang memiliki satu situs yang tidak ingin ini diaktifkan.

Saya pikir saya hanya akan melakukan pemeriksaan sederhana jika hulu saya sudah mengirim saya- Strict-Transport-Securityheader, dan jika tidak, tambahkan saja. Dengan begitu, hulu saya dapat mengirim header STS yang berisi max-age=0untuk menghindari HSTS diaktifkan oleh proxy.

Saya pikir saya baru saja mengubah konfigurasi saya sebagai berikut:

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";
        }
}

Tapi, mungkin karena jika itu jahat , ini tidak berhasil. Saya telah mencoba banyak hal berbeda untuk memastikan variabel benar-benar ada (yang terjadi), tetapi tampaknya tidak ada yang membantu.

Bagaimana saya bisa membuat ini bekerja?

Gerry
sumber

Jawaban:

22

Ini tidak berfungsi karena jika dievaluasi sebelum permintaan diteruskan ke backend, jadi variabel $ upstream_http_ belum memiliki nilai apa pun. add_header dengan nilai kosong diabaikan, sehingga Anda dapat menggunakan peta untuk menambahkan header seperti:

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

server {
  location / {
    add_header Strict-Transport-Security $sts;
  }
}
kolbyjack
sumber
1
Penggunaan peta secara cerdas!
Alexey Ten
ok saya sudah mencoba melakukan sesuatu yang sedikit berbeda tetapi saya tidak dapat menemukan nginx. Bisakah Anda memberi tahu saya di mana saya bisa belajar nginx secara formal? Dan Anda juga dapat membantu saya di sini: serverfault.com/questions/678521/…
Muhammad Umer
5

Itu karena ifdieksekusi sebelum proxy berlangsung dan saat ini tidak ada variabel $upstream_http_strict_transport_security.

Anda bisa menggunakan header_filter_by_luaarahan dari modul Lua. Misalnya

header_filter_by_lua 'if not ngx.header["X-Test"] then ngx.header["X-Test"] = "blah" end';
Alexey Ten
sumber
1
Ini bekerja. Pada Debian 7 Anda bisa mendapatkan dukungan LUA dengan menggunakan Nginx dari backports via apt-get -t wheezy-backports install nginx-extras.
Pieter Ennes