Mengonfigurasi Prosesor Pesan untuk mengizinkan header duplikat

Anda sedang melihat dokumentasi Apigee Edge.
Buka Dokumentasi Apigee X.
info

Sesuai dengan Spesifikasi HTTP RFC 7230, bagian 3.2.2: Urutan Kolom, Apigee Edge mengharapkan bahwa 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 memiliki duplikat.

Secara default, Apigee Edge memungkinkan duplikat dan beberapa nilai untuk diteruskan ke sebagian besar permintaan HTTP {i>header<i}. Namun, itu tidak mengizinkan {i>header<i} tertentu yang tercantum dalam Header yang tidak diizinkan untuk memiliki duplikat dan beberapa nilai. Jadi:

  • Anda akan mendapatkan 400 Bad Request dengan kode error protocol.http.DuplicateHeader jika klien mengirimkan permintaan HTTP dengan lebih dari sekali atau dengan beberapa nilai untuk header HTTP yang tidak diizinkan untuk memiliki duplikat/beberapa nilai di Apigee Edge.
  • Demikian pula, Anda akan mendapatkan 502 Bad Gateway dengan kode error protocol.http.DuplicateHeader jika server backend mengirimkan respons HTTP dengan header tertentu lebih dari sekali atau dengan beberapa nilai untuk header HTTP yang diizinkan memiliki duplikat atau beberapa nilai di Apigee Edge

Solusi yang direkomendasikan untuk mengatasi error ini adalah dengan memperbaiki aplikasi klien dan server backend untuk tidak mengirim header duplikat dan mematuhi spesifikasi RFC 7230, bagian 3.2.2: Urutan Lapangan seperti yang dijelaskan dalam playbook pemecahan masalah berikut:

Namun, dalam beberapa kasus Anda mungkin ingin menambahkan pengecualian untuk menyertakan untuk beberapa header HTTP. Dalam situasi tersebut, Anda dapat mengizinkan header duplikat dan beberapa untuk header HTTP tertentu dengan menyetel properti HTTPHeader.HEADER_NAME di pada level {i>Message Processor<i}.

Dokumen ini memberikan informasi tentang properti ini, menjelaskan cara mengaktifkan properti ini untuk menghindari kesalahan yang disebutkan di atas dan membagikan praktik terbaik tentang hal yang sama.

Properti header HTTP untuk mengizinkan duplikat dan beberapa nilai

Apigee Edge menyediakan dua properti berikut untuk mengontrol perilaku dalam duplikasi dan beberapa nilai untuk header HTTP. Perhatikan bahwa ini hanya dapat dikonfigurasi di Pemroses Pesan menggunakan sintaksis token yang dijelaskan dalam Cara mengonfigurasi Edge.

Nama properti Deskripsi Nilai diizinkan
HTTPHeader.ANY

Properti ini menunjukkan apakah duplikat atau beberapa nilai diizinkan untuk semua HTTP header kustom, termasuk header kustom yang dikirim sebagai bagian dari permintaan HTTP yang dibuat oleh klien atau yang dikirim oleh server backend ke Apigee Edge.

Nilai default:

multivalued, allowDuplicate,

  1. blank: Duplikat dan beberapa nilai untuk header HTTP tidak diizinkan.
  2. multiValued: Memisahkan header multi-nilai menjadi beberapa header. Beberapa nilai diizinkan untuk header HTTP, tetapi duplikat tidak diizinkan. Nilai multiValued diaktifkan, yang menyiratkan bahwa test-header=a,b akan dikonversi menjadi test-header=a dan test-header=b.
  3. allowDuplicate: Mengizinkan beberapa header HTTP (duplikat) dengan nama yang sama.
  4. multivalued, allowDuplicate: Beberapa nilai dan duplikat diizinkan untuk header HTTP.

HTTPHeader.HEADER_NAME

Properti ini digunakan untuk mengganti perilaku {i>header<i} tertentu dari apa yang ditentukan oleh HTTPHeader.ANY

Sama seperti di atas.

Header yang tidak diizinkan untuk memiliki duplikat dan beberapa nilai

Seperti yang dijelaskan sebelumnya, Apigee Edge memungkinkan duplikat dan banyak nilai untuk sebagian besar permintaan {i>header<i} secara {i>default<i}. Hal ini karena properti HTTPHeader.ANY adalah dikonfigurasi dengan nilai multivalued, allowDuplicate.

Konfigurasi ditimpa

Untuk beberapa header tertentu, konfigurasi default akan ditimpa menggunakan salah satu metode:

  • HTTPHeader.HEADER_NAME=multivalued, allowDuplicate

    Konfigurasi ini tidak mengubah perilaku default. Artinya, header tertentu diizinkan untuk memiliki duplikat dan beberapa nilai

    .
  • HTTPHeader.HEADER_NAME=

    Konfigurasi ini mengubah perilaku default. Yaitu, informasi spesifik header tidak diizinkan memiliki duplikat dan beberapa nilai.

Menentukan header yang tidak diizinkan untuk memiliki duplikat dan beberapa nilai

Bagian ini menjelaskan cara mengidentifikasi hal berikut:

  • Header spesifik yang tidak diizinkan untuk memiliki duplikat dan beberapa nilai penyiapan Apigee Edge Private Cloud Anda, dan
  • Header spesifik dengan konfigurasi yang sudah ada
  1. Pada mesin Pemroses Pesan, telusuri properti HTTPHeader. di /opt/apigee/edge-message-processor/conf seperti yang ditunjukkan di bawah ini:

    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>
    
  2. Seperti yang dijelaskan di bagian Konfigurasi ditimpa, perhatikan informasi berikut dalam contoh output di atas:
    1. Header HTTP Connection ditimpa, tetapi diizinkan memiliki duplikat dan beberapa nilai
    2. Header HTTP Host dan Expires akan ditimpa dan tidak diizinkan memiliki duplikat dan beberapa nilai
    3. Header HTTP Date ditimpa dan diizinkan memiliki duplikat tapi bukan diizinkan memiliki beberapa nilai
    4. Semua header yang muncul di sini (Connection, Host, Expires, dan Date dalam contoh di atas) disebut sebagai header dengan konfigurasi yang sudah ada sebelumnya dalam dokumen.

Perilaku Apigee Edge

Tabel berikut menjelaskan perilaku Apigee Edge saat header dikirim sebagai duplikat dan dengan beberapa nilai tergantung pada bagaimana properti HTTPHeader yang dikonfigurasi pada Pemroses Pesan dengan contoh HTTPHeader test-header.

Permintaan Entitas keluar berdasarkan nilai conf/http.properties+HTTPHeader.test-header=
<Kosong> allowDuplicate multiValued allowDuplicate, multiValued (DEFAULT)
test‑header=a,b test‑header=a,b test‑header=a,b

protocol.http.
DuplicateHeader

Secara internal, kami membagi test-header=a,b menjadi:

  • test-header=a, dan
  • test-header=b,

lalu error DuplicateHeader akan ditampilkan.

test‑header=a,b

Secara internal, kami membagi test-header=a,b menjadi:

  • test-header=a, dan
  • test-header=b,

tapi kemudian formulir asli dikirim ke target.

test‑header=a
test‑header=b
protocol.http.
DuplicateHeader
test‑header=a
test‑header=b
protocol.http.
DuplicateHeader
test‑header=a
test‑header=b

Sebelum memulai

Sebelum menggunakan langkah-langkah dalam dokumen ini, pastikan Anda memahami cara mengonfigurasi properti untuk Edge di Private Cloud, dijelaskan dalam Cara mengonfigurasi Edge.

Mengonfigurasi allowDuplicates dan beberapa nilai untuk header

Seperti yang dijelaskan di 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 {i>header<i} tertentu yang nilainya ditimpa secara eksplisit agar izinkan header duplikat atau beberapa nilai untuk ini menggunakan properti HTTPHeader.HEADER_NAME.

Bagian ini menjelaskan cara mengonfigurasi properti HTTPHeader.HEADER_NAME untuk memungkinkan duplikat dan beberapa nilai untuk semua header HTTP tersebut pada Pemroses Pesan, menggunakan token yang sesuai sesuai sintaksis dijelaskan dalam Cara mengonfigurasi Edge.

Di bagian ini, kita akan menggunakan Expires (dan myheader) sebagai contoh yang ingin kita izinkan duplikat dan beberapa nilai seperti yang dijelaskan di bawah ini:

  1. Tentukan nilai saat ini dari properti HTTPHeaderHEADER_NAME untuk memastikannya belum diaktifkan untuk mengizinkan duplikasi dan banyak nilai menggunakan perintah berikut:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Misalnya, jika Anda mencoba menetapkan properti untuk header Expires, periksa nilai saat ini dari token properti HTTPHeader.Expires pada Message Pemroses:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    Output dari perintah di atas menghasilkan salah satu hal berikut:

    1. Properti ini disetel ke kosong, lalu menyiratkan bahwa nilai akan ditimpa (dan adalah header dengan konfigurasi yang sudah ada sebelumnya) untuk TIDAK mengizinkan header duplikat dan beberapa masing-masing. Artinya, Anda tidak diizinkan untuk mengirim header Expires lebih dari sekali sebagai bagian dari permintaan HTTP atau respons HTTP ke Apigee.
    2. Tidak ada klik untuk properti tertentu, berarti nilai itu tidak ditimpa (dan ini BUKAN header dengan konfigurasi yang sudah ada sebelumnya). Artinya {i>header<i} tertentu bisa dikirim lebih dari sekali (duplikat diizinkan) sebagai bagian dari permintaan HTTP atau respons HTTP ke Apigee Edge.
    3. Properti ini ditetapkan dengan nilai allowDuplicates, multivalued, lalu itu berarti nilai ditimpa secara eksplisit (dan ini adalah header dengan konfigurasi yang sudah ada). Ini berarti bahwa {i>header<i} 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=
    

    Contoh output di atas menunjukkan bahwa properti HTTPHeader.Expires disetel ke kosong. Artinya, properti tersebut ditimpa agar tidak mengizinkan duplikat atau beberapa nilai untuk header Expires.

  2. Jika Anda melihat bahwa properti yang sesuai dengan {i>header<i} tertentu secara eksplisit ditimpa agar tidak mengizinkan duplikat atau beberapa nilai seperti dalam contoh output di atas, hanyakan langkah-langkah berikut. Jika tidak secara eksplisit ditimpa, lalu lewati langkah selanjutnya di bagian ini.
  3. Edit. Jika tidak ada, Anda dapat membuatnya:
    /opt/apigee/customer/application/message-processor.properties
    

    Misalnya, untuk membuka file menggunakan vi, masukkan kode berikut:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Tambahkan baris dalam format berikut:
    conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
    
  5. Simpan perubahan.
  6. Pastikan file properti dimiliki oleh pengguna apigee. Jika tidak, jalankan perintah berikut:

    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Mulai ulang Pemroses Pesan:

    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    Untuk memulai ulang tanpa dampak traffic, lihat Memulai ulang Pemroses Pesan tanpa memengaruhi traffic.

  8. Jika Anda memiliki lebih dari satu Pemroses Pesan, ulangi langkah-langkah di atas pada semua Pemroses Pesan.

Memverifikasi header dikonfigurasi agar memiliki duplikat dan beberapa nilai

Bagian ini menjelaskan cara memverifikasi bahwa properti HTTPHeader.HEADER_NAME untuk header tertentu telah diperbarui berhasil mengizinkan duplikasi pada Pemroses Pesan.

Kita akan menggunakan Expires sebagai contoh header dan memeriksa apakah properti yang sesuai HTTPHeader.Expires telah diperbarui.

Meskipun Anda menggunakan token conf_http_HTTPHeader.Expires untuk memperbarui nilai pada Pemroses Pesan, Anda perlu memverifikasi apakah properti HTTPHeader.Expires telah ditetapkan dengan nilai baru.

  1. Di mesin Pemroses Pesan, telusuri properti HTTPHeader.HEADER_NAME dalam /opt/apigee/edge-message-processor/conf dan periksa untuk melihat apakah direktori tersebut dengan nilai baru seperti yang ditunjukkan di bawah ini:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Misalnya, jika Anda ingin memastikan bahwa properti HTTPHeader.Expires telah ditetapkan dengan nilai baru, lalu jalankan perintah berikut:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    
  2. Jika nilai baru berhasil ditetapkan untuk HTTPHeader.HEADER_NAME , aktifkan Pemroses Pesan, maka perintah di atas akan menunjukkan nilai baru dalam File http.properties.
  3. Contoh hasil dari perintah di atas setelah Anda mengonfigurasi allowDuplicates dan multiValued adalah sebagai berikut:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
    
  4. Pada contoh output di atas, perhatikan bahwa properti HTTPHeader.Expires telah ditetapkan dengan nilai baru allowDuplicates, multiValued di http.properties. Ini menunjukkan bahwa perilaku untuk mengizinkan duplikasi dan banyak nilai di HTTPHeader berhasil dikonfigurasi di Pemroses Pesan.
  5. Jika Anda masih melihat nilai lama untuk properti HTTPHeader.HEADER_NAME, kemudian verifikasi bahwa 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 {i>proxy<i} Anda bekerja seperti yang diharapkan, terutama jika ada logika fungsional untuk mendapatkan dan mengatur {i>header<i} di {i>proxy<i}.

  6. Jika Anda masih tidak dapat mengubah properti, hubungi Dukungan Apigee Edge

Menonaktifkan allowDuplicates untuk header

Bagian ini menjelaskan cara mengonfigurasi properti HTTPHeader.{Headername} untuk jangan izinkan duplikat dan beberapa nilai untuk header HTTP tertentu di Pesan Prosesor, menggunakan token yang sesuai sesuai dengan sintaks yang dijelaskan dalam Cara mengonfigurasi Edge.

Di bagian ini, kita akan menggunakan Expires (dan myheader) sebagai contoh yang tidak kita izinkan duplikatnya, seperti dijelaskan di bawah ini:

  1. Tentukan nilai saat ini dari properti HTTPHeaderHEADER_NAME untuk memastikan parameter tersebut belum dinonaktifkan guna mengizinkan duplikat dan beberapa nilai menggunakan perintah berikut:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Misalnya jika Anda mencoba menetapkan properti untuk header Expires lalu periksa nilai saat ini dari token properti HTTPHeader.Expires pada Pemroses Pesan:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    Output dari perintah di atas menghasilkan salah satu hal berikut:

    1. Properti ini disetel ke kosong, yang kemudian menyiratkan bahwa nilai akanditimpa ke NOT untuk mengizinkan header duplikat dan beberapa nilai. Itu adalah Anda tidak diizinkan untuk mengirim header Expires lebih dari sekali sebagai bagian dari permintaan HTTP atau respons HTTP ke Apigee.
    2. Tidak ada klik untuk properti tertentu, berarti nilai itu tidak ditimpa dan ini adalah header NOT dengan konfigurasi yang sudah ada sebelumnya. Artinya {i>header<i} tertentu bisa dikirim lebih dari sekali (duplikat diperbolehkan) sebagai bagian dari Permintaan HTTP atau respons HTTP ke Apigee Edge.
    3. Properti ini disetel dengan nilai allowDuplicates, multivalued maka berarti nilainya ditimpa secara eksplisit dan ini merupakan konfigurasi yang sudah ada. Namun, ini berarti bahwa {i>header<i} tertentu bisa dikirim lebih dari sekali (duplikat adalah diizinkan) sebagai bagian dari permintaan HTTP atau respons HTTP ke Apigee.

    Contoh output #1

    Contoh Output #1 dari perintah penelusuran:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
    

    Contoh output menunjukkan bahwa properti HTTPHeader.Expires disetel ke allowDuplicates, multiValued. Ini berarti bahwa properti adalah ditimpa untuk memungkinkan duplikat atau beberapa nilai untuk header Expires.

    Contoh output #2

    Contoh Perintah dan Output #2 dari perintah penelusuran

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    

    Output contoh tidak menunjukkan output, yang menyiratkan bahwa properti HTTPHeader.myheader disetel ke allowDuplicates, multiValued secara default. Hal ini juga menyiratkan bahwa properti tidak ditimpa untuk header myheader,

  2. Jika Anda melihat salah satu dari hal berikut, lakukan langkah-langkah selanjutnya di bagian ini:
    1. Properti yang terkait dengan header tertentu ditimpa untuk memungkinkan duplikasi dan beberapa nilai seperti dalam Contoh output #1 di atas (header dengan konfigurasi yang sudah ada)
    2. Tidak ada klik untuk properti yang sesuai dengan {i>header<i} tertentu seperti pada Contoh output #2 di atas (bukan header dengan konfigurasi yang sudah ada sebelumnya)

    Jika tidak, lewati langkah selanjutnya di bagian ini.

  3. Edit file berikut. Jika tidak ada, Anda dapat membuatnya.
    /opt/apigee/customer/application/message-processor.properties
    

    Misalnya, untuk membuka file menggunakan vi, masukkan kode berikut:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. Tambahkan baris dalam format berikut ke file properti:

    Konfigurasi yang sudah ada

    Skenario #1: Header dengan konfigurasi yang sudah ada sebelumnya:

    conf_http_HTTPHeader.Expires=
    

    Tidak ada konfigurasi yang sudah ada

    Skenario #2: Bukan header dengan konfigurasi yang sudah ada sebelumnya:

    conf/http.properties+HTTPHeader.myheader=
    
  5. Simpan perubahan.
  6. Pastikan file properti dimiliki oleh pengguna apigee. Jika tidak, jalankan perintah berikut:
    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Mulai ulang Pemroses Pesan:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    Untuk memulai ulang tanpa dampak traffic, lihat Memulai ulang Pemroses Pesan tanpa memengaruhi traffic.

  8. Jika Anda memiliki lebih dari satu Pemroses Pesan, ulangi langkah-langkah di atas pada semua Pemroses Pesan Prosesor.

Memverifikasi header dikonfigurasi untuk tidak mengizinkan duplikat dan beberapa nilai

Bagian ini menjelaskan cara memverifikasi bahwa properti HTTPHeader.HEADER_NAME untuk header tertentu telah diperbarui berhasil tidak mengizinkan duplikasi pada Pemroses Pesan.

Kita akan menggunakan Expires (dan myheader) sebagai contoh header dan memeriksa apakah properti HTTPHeader.Expires yang sesuai (dan HTTPHeader.myheader) telah diperbarui.

  1. Di mesin Pemroses Pesan, telusuri properti HTTPHeader.HEADER_NAME di direktori /opt/apigee/edge-message- processor/conf dan periksa apakah nilai tersebut telah disetel dengan nilai baru sebagai yang ditampilkan di bawah ini:

    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    Misalnya, jika Anda ingin memeriksa properti HTTPHeader.Expires disetel 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
    
  2. Jika nilai header HTTP baru berhasil ditetapkan untuk HTTPHeader.HEADER_NAME I pada Pemroses Pesan, lalu yang di atas menunjukkan nilai baru dalam file http.properties.
  3. Contoh hasil dari perintah di atas setelah Anda menonaktifkannya allowDuplicates adalah sebagai berikut:

    Konfigurasi yang sudah ada

    Skenario #1: Expires Header (header dengan konfigurasi yang sudah ada sebelumnya)

    /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 sebelumnya)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
    
  4. Pada contoh output di atas, perhatikan bahwa properti HTTPHeader.Expires ( dan HTTPHeader.myheader ) telah ditetapkan dengan nilai baru {blank} di http.properties. Ini menunjukkan bahwa perilaku untuk mengizinkan duplikasi dan beberapa nilai untuk header HTTP tertentu Expires (dan myheader) berhasil dinonaktifkan pada Pemroses Pesan.
  5. Jika Anda masih melihat nilai lama untuk properti HTTPHeader.Expires (or HTTPHeader.myheader), verifikasi bahwa Anda telah mengikuti semua langkah yang diuraikan di 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 mengatur {i>header<i} di proxy.

  6. Jika Anda masih tidak dapat mengubah properti, hubungi Dukungan Apigee Edge.