Bagaimana cara menambahkan header respons pada nginx saat menggunakan proxy_pass?


92

Saya ingin menambahkan tajuk khusus untuk tanggapan yang diterima dari server di belakang nginx.

Meskipun add_headerberfungsi untuk respons yang diproses nginx, ia tidak melakukan apa pun saat proxy_passdigunakan.


Jadi Anda meneruskan permintaan ke proxy dan respons set proxy itu dan pada respons ini Anda ingin menambahkan header kustom Anda sebelum dikirim ke pengguna, benar?
emka86

Jawaban:


31

Ada modul bernama HttpHeadersMoreModule yang memberi Anda kontrol lebih besar atas header. Itu tidak datang dengan Nginx dan membutuhkan instalasi tambahan. Dengan itu, Anda dapat melakukan sesuatu seperti ini:

location ... {
  more_set_headers "Server: my_server";
}

Itu akan "menyetel header output Server ke nilai kustom untuk kode status dan jenis konten apa pun". Ini akan mengganti header yang sudah disetel atau menambahkannya jika tidak disetel.


apakah mungkin untuk menambahkan Securedan HttpOnlymenandai pada cookie tanggapan ? Cookie respons target hanya memiliki cookie namedan expireatribut.
JPaulPunzalan

2
Anda tidak perlu pustaka untuk dapat mengubah atau menambahkan header respons dan berlawanan dengan jawaban yang paling banyak dipilih, Anda dapat mengganti header, Anda hanya perlu menghapusnya terlebih dahulu. Lihat jawaban saya di bawah untuk detailnya.
Layu

162

add_headerbekerja sebaik proxy_passtanpa. Saya baru saja menyiapkan konfigurasi di mana saya telah menggunakan petunjuk itu. Saya harus mengakui bahwa saya juga berjuang untuk mengatur ini tanpa benar-benar mengingat alasannya.

Saat ini saya memiliki konfigurasi yang berfungsi dan berisi yang berikut (antara lain):

server {
    server_name  .myserver.com
    location / {
        proxy_pass  http://mybackend;
        add_header  X-Upstream  $upstream_addr;
    }
}

Sebelumnya nginx 1.7.5 add_header hanya berfungsi pada respons yang berhasil, berbeda dengan HttpHeadersMoreModule yang disebutkan oleh Sebastian Goodman dalam jawabannya .

Sejak nginx 1.7.5Anda dapat menggunakan kata kunci alwaysuntuk menyertakan header khusus bahkan dalam respons kesalahan. Sebagai contoh:

add_header X-Upstream $upstream_addr always;

Batasan: Anda tidak dapat mengganti nilai serverheader menggunakan add_header.


41
Sejak nginx 1.7.5 Anda dapat menggunakan "selalu" untuk menyertakan tajuk khusus dalam respons kesalahan menggunakan add_header:add_header X-Upstream $upstream_addr always;
Shane

Pokoknya memiliki fungsionalitas serupa tanpa mengekspos kombinasi IP / port dari server yang di-proxy? misalnya X-Upstream: 10.10.10.10vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687(md5 mungkin tidak membantu dalam menutupi infrastruktur, tetapi menyampaikan gagasan).
zamnuts

@zamnuts: Meneruskan IP upstream dan nomor port hanyalah contoh penggunaan add_headerdirektif. Anda tidak perlu mengirimnya sama sekali.
Oliver

@Oliver, saya mengetahuinya, tetapi saya menanyakan tentang pengenal upstream unik / individu alternatif selain nomor IP / port, atau kebingungannya. Mungkin pertanyaan saya di luar jangkauan dan saya harus membuat postingan baru :)
zamnuts

@zamnuts: Saya juga menyarankan untuk mengajukan pertanyaan baru :-)
Oliver

25

Seperti yang ditulis oliver:

add_headerbekerja sebaik proxy_passtanpa.

Namun, seperti yang ditulis Shane, pada Nginx 1.7.5, Anda harus meneruskan alwaysagar add_headerdapat bekerja untuk respons kesalahan, seperti:

add_header  X-Upstream  $upstream_addr always;

5
Saya menghabiskan waktu lama bertanya-tanya mengapa header saya tidak muncul, mencoba memindahkannya di blok server, blok lokasi, ... dan inilah alasannya: nginx tidak menambahkannya pada respons kesalahan: F Terima kasih
Shautieh

Saya juga :) dan meskipun jawaban ini baru saja terjadi pada saya beberapa hari yang lalu. Harus meninjau jawaban saya sendiri.
Dmitry Minkovsky


16

Sembunyikan header respons, lalu tambahkan nilai header kustom baru

Menambahkan header dengan add_headerberfungsi baik dengan proxy pass, tetapi jika ada nilai header yang ada dalam respons itu akan menumpuk nilainya.

Jika Anda ingin menyetel atau mengganti nilai header (misalnya, mengganti Access-Control-Allow-Originheader agar sesuai dengan klien Anda untuk mengizinkan berbagi sumber daya lintas sumber), Anda dapat melakukan hal berikut:

# 1. hide the Access-Control-Allow-Origin from the server response
proxy_hide_header Access-Control-Allow-Origin;
# 2. add a new custom header that allows all * origins instead
add_header Access-Control-Allow-Origin *;

Jadi proxy_hide_headerdikombinasikan dengan add_headermemberi Anda kekuatan untuk mengatur / mengganti nilai header respons.

Jawaban serupa dapat ditemukan di sini di ServerFault

MEMPERBARUI:

Catatan: proxy_set_header adalah untuk menyetel header permintaan sebelum permintaan dikirim lebih lanjut, bukan untuk menyetel header respons (atribut konfigurasi untuk header ini bisa sedikit membingungkan).


Terima kasih, sangat membantu
Lancer. Yan

14

Anda dapat mencoba solusi ini:

Di locationblok Anda saat Anda menggunakan proxy_passlakukan sesuatu seperti ini:

location ... {

  add_header yourHeaderName yourValue;
  proxy_pass xxxx://xxx_my_proxy_addr_xxx;

  # Now use this solution:
  proxy_ignore_headers yourHeaderName // but set by proxy

  # Or if above didn't work maybe this:
  proxy_hide_header yourHeaderName // but set by proxy

}

Saya tidak yakin apakah itu persis yang Anda butuhkan tetapi coba beberapa manipulasi metode ini dan mungkin hasilnya sesuai dengan masalah Anda.

Anda juga dapat menggunakan kombinasi ini:

proxy_hide_header headerSetByProxy;
set $sent_http_header_set_by_proxy yourValue;

6
Saya harus menggunakan metode ini karena nginx menambahkan header duplikat daripada menimpa yang sudah ada. location / { proxy_pass http://127.0.0.1:8080/; proxy_hide_header "Access-Control-Allow-Origin"; if ($http_origin ~* "^https://(example.com|www.example.com)$") { add_header Access-Control-Allow-Origin "$http_origin"; } }
ether6
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.