Anda sedang melihat dokumentasi Apigee Edge.
Buka dokumentasi
Apigee X. info
Sesuai dengan Spesifikasi HTTP RFC 7230, bagian 3.2.2: Field Order, Apigee Edge mengharapkan agar permintaan HTTP dari klien atau respons HTTP dari server backend tidak berisi header yang sama yang diteruskan lebih dari sekali dengan nilai yang sama atau berbeda, kecuali jika header tertentu memiliki pengecualian dan diizinkan untuk memiliki duplikat.
Secara default, Apigee Edge mengizinkan duplikat dan beberapa nilai diteruskan ke sebagian besar header HTTP. Namun, header tertentu yang tercantum dalam Header yang tidak boleh memiliki duplikat dan beberapa nilai tidak diizinkan. Jadi:
- Anda akan mendapatkan
400 Bad Requestdengan kode errorprotocol.http.DuplicateHeaderjika klien mengirim permintaan HTTP dengan header tertentu lebih dari sekali atau dengan beberapa nilai untuk header HTTP yang tidak diizinkan memiliki duplikat/beberapa nilai di Apigee Edge. - Demikian pula, Anda akan mendapatkan
502 Bad Gatewaydengan kode errorprotocol.http.DuplicateHeaderjika server backend mengirimkan respons HTTP dengan header tertentu lebih dari sekali atau dengan beberapa nilai untuk header HTTP yang tidak diizinkan memiliki duplikat atau beberapa nilai di Apigee Edge
Solusi yang direkomendasikan untuk mengatasi error ini adalah memperbaiki aplikasi klien dan server backend agar tidak mengirim header duplikat dan mematuhi spesifikasi RFC 7230, bagian 3.2.2: Urutan Kolom seperti yang dijelaskan dalam playbook pemecahan masalah berikut:
Namun, dalam beberapa kasus, Anda mungkin ingin menambahkan pengecualian untuk menyertakan duplikat dan beberapa
nilai untuk beberapa header HTTP. Dalam situasi seperti itu, Anda dapat mengizinkan header duplikat dan beberapa
nilai untuk header HTTP tertentu dengan menyetel properti HTTPHeader.HEADER_NAME di
level Message Processor.
Dokumen ini memberikan informasi tentang properti ini, menjelaskan cara mengaktifkan properti ini untuk menghindari error yang disebutkan di atas, dan membagikan praktik terbaik terkait hal tersebut.
Properti header HTTP untuk mengizinkan duplikat dan beberapa nilai
Apigee Edge menyediakan dua properti berikut untuk mengontrol perilaku yang memungkinkan duplikat dan beberapa nilai untuk header HTTP. Perhatikan bahwa ini hanya dapat dikonfigurasi di Message Processor menggunakan sintaksis token yang dijelaskan dalam Cara mengonfigurasi Edge.
| Nama properti | Deskripsi | Nilai yang diizinkan |
|---|---|---|
HTTPHeader.ANY |
Properti ini menunjukkan apakah duplikat atau beberapa nilai diizinkan untuk semua header HTTP, termasuk header kustom yang dikirim sebagai bagian dari permintaan HTTP yang dibuat oleh klien atau respons HTTP yang dikirim oleh server backend ke Apigee Edge. Nilai default:
|
|
|
Properti ini digunakan untuk mengganti perilaku header tertentu dari apa yang
ditentukan oleh |
Sama seperti di atas. |
Header yang tidak diizinkan memiliki duplikat dan beberapa nilai
Seperti yang dijelaskan sebelumnya, Apigee Edge memungkinkan duplikat dan beberapa nilai untuk sebagian besar header HTTP secara default. Hal ini karena properti HTTPHeader.ANY dikonfigurasi dengan nilai multiValued, allowDuplicates.
Konfigurasi ditimpa
Untuk beberapa header tertentu, konfigurasi default diganti menggunakan salah satu metode berikut:
HTTPHeader.HEADER_NAME=multiValued, allowDuplicatesKonfigurasi ini tidak mengubah perilaku default. Artinya, header tertentu diizinkan untuk memiliki duplikat dan beberapa nilai
.HTTPHeader.HEADER_NAME=Konfigurasi ini mengubah perilaku default. Artinya, header tertentu tidak boleh memiliki duplikat dan beberapa nilai.
Menentukan header yang tidak boleh memiliki duplikat dan beberapa nilai
Bagian ini menjelaskan cara mengidentifikasi hal berikut:
- Header tertentu yang tidak boleh memiliki duplikat dan beberapa nilai pada penyiapan Apigee Edge Private Cloud Anda, dan
- Header tertentu dengan konfigurasi yang sudah ada
Di mesin Message Processor, telusuri properti
HTTPHeader.di direktori/opt/apigee/edge-message-processor/confseperti yang ditunjukkan di bawah:grep -ri "HTTPHeader." /opt/apigee/edge-message-processor/conf
Contoh output:
# grep -ri "HTTPHeader" /opt/apigee/edge-message-processor/conf /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.ANY=allowDuplicates, multiValued /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Connection=allowDuplicates, multiValued … <snipped> /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Host= /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires= /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Date=allowDuplicates … <snipped>
- Seperti yang dijelaskan di bagian Konfigurasi diganti,
perhatikan informasi berikut dalam contoh output di atas:
- Header HTTP
Connectionditimpa, tetapi diizinkan untuk memiliki duplikat dan beberapa nilai - Header HTTP
HostdanExpiresdiganti dan tidak boleh memiliki duplikat dan beberapa nilai - Header HTTP
Dateditimpa dan diizinkan memiliki duplikat tetapi tidak diizinkan memiliki beberapa nilai - Semua header yang muncul di sini (
Connection,Host,Expires, danDatedalam contoh di atas) disebut sebagai header dengan konfigurasi yang sudah ada sebelumnya dalam dokumen ini.
- Header HTTP
Perilaku Apigee Edge
Tabel berikut menjelaskan perilaku Apigee Edge saat header dikirim sebagai
duplikat dan dengan beberapa nilai, bergantung pada cara properti HTTPHeader
dikonfigurasi di Pemroses Pesan dengan contoh HTTPHeader
test-header.
| Permintaan | HEADER keluar berdasarkan nilai conf/http.properties+HTTPHeader.test-header= | |||
|---|---|---|---|---|
| <Blank> | allowDuplicates | multiValued | allowDuplicates, multiValued (DEFAULT) | |
test‑header=a,b |
test‑header=a,b |
test‑header=a,b |
Secara internal, kami membagi
dan kemudian error |
Secara internal, kami membagi
Namun, formulir asli dikirim ke target. |
test‑header=atest‑header=b |
protocol.http. |
test‑header=atest‑header=b |
protocol.http. |
test‑header=atest‑header=b |
Sebelum memulai
Sebelum menggunakan langkah-langkah dalam dokumen ini, pastikan Anda memahami cara mengonfigurasi properti untuk Edge di Private Cloud, yang dijelaskan dalam Cara mengonfigurasi Edge.
Mengonfigurasi allowDuplicates dan beberapa nilai untuk header
Seperti yang dijelaskan dalam Properti header HTTP untuk mengizinkan duplikat dan
beberapa nilai, nilai properti HTTPHeader.ANY = allowDuplicates,
multiValued menyiratkan bahwa semua header diizinkan untuk memiliki duplikat dan beberapa nilai di
Apigee Edge. Namun, ada header tertentu yang nilainya diganti secara eksplisit agar tidak
mengizinkan header duplikat atau beberapa nilai untuk header ini menggunakan properti
HTTPHeader.HEADER_NAME.
Bagian ini menjelaskan cara mengonfigurasi properti
HTTPHeader.HEADER_NAME untuk mengizinkan duplikat dan beberapa nilai untuk header HTTP
tersebut di Pemroses Pesan, menggunakan token yang sesuai dengan sintaksis
yang dijelaskan dalam Cara mengonfigurasi Edge.
Di bagian ini, kita akan menggunakan Expires (dan myheader) sebagai contoh header yang ingin kita izinkan duplikat dan beberapa nilainya seperti yang dijelaskan di bawah:
-
Tentukan nilai saat ini dari properti
HTTPHeaderHEADER_NAMEuntuk memastikan properti tersebut belum diaktifkan untuk mengizinkan duplikat dan beberapa nilai menggunakan perintah berikut:grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
Misalnya, jika Anda mencoba menyetel properti untuk header
Expires, maka periksa nilai token propertiHTTPHeader.Expiressaat ini di Message Processor:grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
Output perintah di atas akan menghasilkan salah satu dari berikut ini:
- Properti ditetapkan ke kosong, lalu menyiratkan bahwa nilai ditimpa (dan ini
adalah header dengan konfigurasi yang sudah ada sebelumnya) agar TIDAK mengizinkan header duplikat dan beberapa
nilai. Artinya, Anda tidak diizinkan mengirim header
Expireslebih dari sekali sebagai bagian dari permintaan HTTP atau respons HTTP ke Apigee. - Tidak ada hit untuk properti tertentu, berarti nilai tersebut tidak ditimpa (dan ini BUKAN header dengan konfigurasi yang sudah ada sebelumnya). Artinya, header tertentu dapat dikirim lebih dari sekali (duplikat diizinkan) sebagai bagian dari permintaan HTTP atau respons HTTP ke Apigee Edge.
- Properti ditetapkan dengan nilai
allowDuplicates, multiValued, yang berarti nilai tersebut ditimpa secara eksplisit (dan ini adalah header dengan konfigurasi yang sudah ada sebelumnya). Artinya, header tertentu dapat dikirim lebih dari sekali (duplikat diizinkan) sebagai bagian dari permintaan HTTP atau respons HTTP ke Apigee.
Contoh output perintah penelusuran:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
Output contoh di atas menunjukkan bahwa properti
HTTPHeader.Expiresditetapkan ke kosong. Artinya, properti ditimpa menjadi tidak mengizinkan nilai duplikat atau beberapa nilai untuk headerExpires. - Properti ditetapkan ke kosong, lalu menyiratkan bahwa nilai ditimpa (dan ini
adalah header dengan konfigurasi yang sudah ada sebelumnya) agar TIDAK mengizinkan header duplikat dan beberapa
nilai. Artinya, Anda tidak diizinkan mengirim header
- Jika Anda melihat bahwa properti yang sesuai dengan header tertentu ditimpa secara eksplisit menjadi tidak mengizinkan nilai duplikat atau beberapa nilai seperti pada contoh output di atas, baru kemudian lakukan langkah-langkah berikut. Jika tidak diganti secara eksplisit, lewati langkah-langkah lainnya di bagian ini.
- Edit. Jika tidak ada, Anda dapat membuatnya:
/opt/apigee/customer/application/message-processor.properties
Misalnya, untuk membuka file menggunakan vi, masukkan perintah berikut:
vi /opt/apigee/customer/application/message-processor.properties
- Tambahkan baris dalam format berikut:
conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
- Simpan perubahan.
Pastikan file properti dimiliki oleh pengguna
apigee. Jika tidak, jalankan perintah berikut:chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
Mulai ulang Pemroses Pesan:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
Untuk memulai ulang tanpa memengaruhi traffic, lihat Memulai ulang Message Processor secara bertahap tanpa memengaruhi traffic.
- Jika Anda memiliki lebih dari satu Pemroses Pesan, ulangi langkah-langkah di atas di semua Pemroses Pesan.
Memverifikasi bahwa header dikonfigurasi untuk memiliki duplikat dan beberapa nilai
Bagian ini menjelaskan cara memverifikasi bahwa properti
HTTPHeader.HEADER_NAME untuk header tertentu telah berhasil diperbarui
untuk mengizinkan duplikat di Pemroses Pesan.
Kita akan menggunakan Expires sebagai header contoh dan memeriksa apakah properti yang sesuai, yaitu HTTPHeader.Expires, telah diperbarui.
Meskipun Anda menggunakan token conf_http_HTTPHeader.Expires untuk memperbarui nilai di
Pemroses Pesan, Anda perlu memverifikasi apakah properti HTTPHeader.Expires yang sebenarnya
telah ditetapkan dengan nilai baru.
- Di mesin Message Processor, telusuri properti
HTTPHeader.HEADER_NAMEdi direktori/opt/apigee/edge-message-processor/confdan periksa apakah properti tersebut telah ditetapkan dengan nilai baru seperti yang ditunjukkan di bawah:grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
Misalnya, jika Anda ingin memeriksa apakah properti
HTTPHeader.Expiresditetapkan dengan nilai baru, jalankan perintah berikut:grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
- Jika nilai baru berhasil ditetapkan untuk
HTTPHeader.HEADER_NAMEdi Message Processor, perintah di atas akan menampilkan nilai baru dalam filehttp.properties. Contoh hasil dari perintah di atas setelah Anda mengonfigurasi
allowDuplicatesdanmultiValuedadalah sebagai berikut:/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
- Dalam contoh output di atas, perhatikan bahwa properti
HTTPHeader.Expirestelah ditetapkan dengan nilai baruallowDuplicates, multiValueddihttp.properties. Hal ini menunjukkan bahwa perilaku untuk mengizinkan duplikat dan beberapa nilai dalamHTTPHeaderberhasil dikonfigurasi di Pemroses Pesan. - Jika Anda masih melihat nilai lama untuk properti
HTTPHeader.HEADER_NAME, maka pastikan Anda telah mengikuti semua langkah yang diuraikan dalam Mengonfigurasi allowDuplicates dan beberapa nilai untuk header dengan benar. Jika Anda melewatkan langkah apa pun, ulangi semua langkah dengan benar.Pastikan proxy Anda berfungsi seperti yang diharapkan, terutama jika ada logika fungsional untuk mendapatkan dan menyetel header di proxy.
- Jika Anda masih tidak dapat mengubah properti, hubungi Dukungan Apigee Edge
Menonaktifkan allowDuplicates untuk header
Bagian ini menjelaskan cara mengonfigurasi properti HTTPHeader.{Headername} agar
tidak mengizinkan duplikat dan beberapa nilai untuk header HTTP tertentu di Message
Processors, menggunakan token yang sesuai menurut sintaksis yang dijelaskan dalam
Cara mengonfigurasi Edge.
Di bagian ini, kita akan menggunakan Expires (dan myheader) sebagai contoh
header yang tidak boleh memiliki duplikat seperti yang dijelaskan di bawah:
-
Tentukan nilai saat ini dari properti
HTTPHeaderHEADER_NAMEuntuk memastikan belum dinonaktifkan untuk mengizinkan duplikat dan beberapa nilai menggunakan perintah berikut:grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
Misalnya, jika Anda mencoba menyetel properti untuk header
Expires, periksa nilai saat ini dari token propertiHTTPHeader.Expiresdi Pemroses Pesan:grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
Output perintah di atas akan menghasilkan salah satu dari berikut ini:
- Properti disetel ke kosong, lalu menyiratkan bahwa nilai iditimpa menjadi TIDAK
untuk mengizinkan header duplikat dan beberapa nilai. Artinya, Anda tidak diizinkan mengirim
header
Expireslebih dari sekali sebagai bagian dari permintaan HTTP atau respons HTTP ke Apigee. - Tidak ada hit untuk properti tertentu, berarti nilai tersebut tidak ditimpa dan ini adalah header NOT dengan konfigurasi yang sudah ada sebelumnya. Artinya, header tertentu dapat dikirim lebih dari sekali (duplikat diizinkan) sebagai bagian dari permintaan HTTP atau respons HTTP ke Apigee Edge.
- Properti disetel dengan nilai
allowDuplicates, multiValued, yang berarti nilai tersebut ditimpa secara eksplisit dan ini adalah konfigurasi yang ada. Namun, header tertentu dapat dikirim lebih dari sekali (duplikat diizinkan) sebagai bagian dari permintaan HTTP atau respons HTTP ke Apigee.
Contoh output #1
Contoh Output #1 perintah penelusuran:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
Output sampel menunjukkan bahwa properti
HTTPHeader.Expiresdisetel keallowDuplicates, multiValued. Artinya, properti is ditimpa untuk mengizinkan nilai duplikat atau beberapa nilai untuk headerExpires.Contoh output #2
Contoh Perintah dan Output #2 dari perintah penelusuran
grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
Output sampel tidak menampilkan output, yang berarti properti
HTTPHeader.myheaderditetapkan keallowDuplicates, multiValuedsecara default. Hal ini juga menyiratkan bahwa properti tidak ditimpa untuk header myheader, - Properti disetel ke kosong, lalu menyiratkan bahwa nilai iditimpa menjadi TIDAK
untuk mengizinkan header duplikat dan beberapa nilai. Artinya, Anda tidak diizinkan mengirim
header
- Jika Anda melihat salah satu hal berikut, lakukan langkah-langkah lainnya di bagian ini:
- Properti yang sesuai dengan header tertentu akan diganti untuk mengizinkan duplikat dan beberapa nilai seperti pada Contoh output #1 di atas (header dengan konfigurasi yang sudah ada)
- Tidak ada hit untuk properti yang sesuai dengan header tertentu seperti pada Contoh output #2 di atas (bukan header dengan konfigurasi yang sudah ada)
Jika tidak, lewati langkah-langkah lainnya di bagian ini.
- Edit file berikut. Jika tidak ada, Anda dapat membuatnya.
/opt/apigee/customer/application/message-processor.properties
Misalnya, untuk membuka file menggunakan vi, masukkan perintah berikut:
vi /opt/apigee/customer/application/message-processor.properties
- Tambahkan baris dalam format berikut ke file properti:
Konfigurasi yang sudah ada
Skenario #1: Header dengan konfigurasi yang sudah ada:
conf_http_HTTPHeader.Expires=
Tidak ada konfigurasi yang sudah ada
Skenario #2: Bukan header dengan konfigurasi yang sudah ada:
conf/http.properties+HTTPHeader.myheader=
- Simpan perubahan.
- Pastikan file properti dimiliki oleh pengguna
apigee. Jika tidak, jalankan perintah berikut:chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
- Mulai ulang Pemroses Pesan:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
Untuk memulai ulang tanpa memengaruhi traffic, lihat Memulai ulang Message Processor secara bertahap tanpa memengaruhi traffic.
- Jika Anda memiliki lebih dari satu Pemroses Pesan, ulangi langkah-langkah di atas di semua Pemroses Pesan.
Memverifikasi bahwa header dikonfigurasi agar tidak mengizinkan duplikat dan beberapa nilai
Bagian ini menjelaskan cara memverifikasi bahwa properti
HTTPHeader.HEADER_NAME untuk header tertentu telah berhasil diperbarui
agar tidak mengizinkan duplikat di Pemroses Pesan.
Kita akan menggunakan Expires (dan myheader) sebagai header contoh dan memeriksa apakah
properti HTTPHeader.Expires (dan
HTTPHeader.myheader) yang sesuai telah diperbarui.
Di mesin Message Processor, telusuri properti
HTTPHeader.HEADER_NAMEdi direktori/opt/apigee/edge-message- processor/confdan periksa apakah properti tersebut telah ditetapkan dengan nilai baru seperti yang ditunjukkan di bawah:grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
Misalnya, jika Anda ingin memeriksa apakah properti
HTTPHeader.Expiresditetapkan dengan nilai baru, Anda dapat menjalankan perintah berikut:Konfigurasi yang sudah ada
grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
Tidak ada konfigurasi yang sudah ada
grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
- Jika nilai header HTTP baru berhasil ditetapkan untuk
HTTPHeader.HEADER_NAMEI di Message Processor, perintah di atas akan menampilkan nilai baru dalam filehttp.properties. - Contoh hasil dari perintah di atas setelah Anda menonaktifkan
allowDuplicatesadalah sebagai berikut:Konfigurasi yang sudah ada
Skenario #1: Header Expired (header dengan konfigurasi yang sudah ada)
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
Tidak ada konfigurasi yang sudah ada
Skenario #2: Header myheader (bukan header dengan konfigurasi yang sudah ada)
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
- Dalam contoh output di atas, perhatikan bahwa properti
HTTPHeader.Expires( danHTTPHeader.myheader) telah ditetapkan dengan nilai baru {blank}dihttp.properties. Hal ini menunjukkan bahwa perilaku untuk mengizinkan duplikat dan beberapa nilai untuk header HTTPExpires(danmyheader) tertentu berhasil dinonaktifkan di Pemroses Pesan. Jika Anda masih melihat nilai lama untuk properti
HTTPHeader.Expires (or HTTPHeader.myheader), pastikan Anda telah mengikuti semua langkah yang diuraikan dalam Mengonfigurasi allowDuplicates dan beberapa nilai untuk header dengan benar. Jika Anda melewatkan langkah apa pun, ulangi semua langkah dengan benar.Pastikan proxy Anda berfungsi seperti yang diharapkan, terutama jika ada logika fungsional untuk mendapatkan dan menyetel header di proxy.
- Jika Anda masih tidak dapat mengubah properti, hubungi Dukungan Apigee Edge.