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.
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.
Jawaban:
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.
Securedan HttpOnlymenandai pada cookie tanggapan ? Cookie respons target hanya memiliki cookie namedan expireatribut.
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.
add_header X-Upstream $upstream_addr always;
X-Upstream: 10.10.10.10vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687(md5 mungkin tidak membantu dalam menutupi infrastruktur, tetapi menyampaikan gagasan).
add_headerdirektif. Anda tidak perlu mengirimnya sama sekali.
Seperti yang ditulis oliver:
add_headerbekerja sebaikproxy_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;
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
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).
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;
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"; } }