Bagaimana cara menambahkan header tanggapan dengan HAproxy 1.6 berdasarkan permintaan URI?

9

Saya menggunakan HAproxy 1.6 sebagai penyeimbang beban di depan server kucing jantan.

Saya perlu menambahkan header tanggapan berdasarkan permintaan URI.

Untuk misalnya, saya ingin menambahkan header respon Cache-Control public,max-age="600"ketika permintaan uri adalah /apitetapi tidak ketika permintaan uri adalah sesuatu yang lain.

  • Percobaan pertama saya menggunakan acl berdasarkan path untuk menambahkan header ke http-response:

    acl api path_reg ^/api/(.*)$
    http-response add-header Cache-Control public,max-age="600" if api
    

    Ketika saya mulai haproxy -d, saya memiliki peringatan yang mengatakan bahwa path_reg(atau path) tidak kompatibel dengan http-response:

    Dec  6 15:22:29 ip-10-30-0-196 haproxy-systemd-wrapper[315]: 
    [WARNING] 340/152229 (2035) : parsing 
    [/etc/haproxy/haproxy.cfg:78] : acl 'api' will never match because 
    it only involves keywords that are incompatible with 'backend 
    http-response header rule'
    
  • Saya mencoba menambahkan tajuk http-requestalih-alih http-response:

    acl api path_reg ^/api/(.*)$
    http-request add-header Cache-Control public,max-age="600" if api
    

    Itu berhasil tetapi saya membutuhkannya dalam respons

  • Saya juga mencoba menggunakan variabel haproxy:

    http-request set-var(txn.path) path
    acl path_acl %[var(txn.path)] -m ^/api/(.*)$
    http-response add-header Cache-Control public,max-age="600" if path_acl
    

    Tetapi ketika saya mencoba HAproxy tidak memulai acara dan saya memiliki kesalahan berikut:

    [ALERT] 340/162647 (2241) : parsing [/etc/haproxy/haproxy.cfg:48] 
    : error detected while parsing ACL 'path_acl' : unknown fetch 
    method '%[var' in ACL expression '%[var(txn.path)]'.
    

Bagaimana saya bisa menggunakan jalur permintaan ke ACL untuk mengatur header respons?

jmlrt
sumber

Jawaban:

9

Coba ini:

http-response set-header Cache-Control no-cache,\ max-age=600 if { capture.req.uri -m beg /api/ }

capture.req.uritetap ada sampai respons diproses, tidak seperti path, yang tidak.

Beberapa catatan:

Contoh ini menggunakan ACL anonim. Anda juga bisa melakukannya dengan ACL bernama, tetapi itu membutuhkan 2 baris.

Tidak ada alasan saya menyadari mengapa Anda harus mengutip nilai max-age.

Anda mungkin tidak ingin add-header, Anda ingin set-header, yang memastikan bahwa jika sudah ada, itu akan dihapus.

acl path_acl %[var(txn.path)] -m ^/api/(.*)$mungkin ditulis dengan benar sebagai acl path_acl var(txn.path) -m ^/api/(.*)$. HAProxy sedikit canggung tentang kapan ia mengharapkan %[ ]dan kapan tidak. Saya yakin ada polanya, tapi saya tidak jelas apa itu.

Michael - sqlbot
sumber
1
Terima kasih atas tanggapan Anda. Kedua metode menggunakan capture.req.uridan variabel saat mengeluarkan %[ ]di acl̀bekerja. Anda juga benar tentang tanda kutip di sekitar max-agenilai dan set-headerbukan add-header.
jmlrt
1
Perhatikan bahwa secara internal, saya melakukan sesuatu yang serupa, jika back-end tidak memberikan Cache-Controlrespons: Saya menambahkan Cache-Control-Authority: implicit, gatewayheader untuk memberikan pengembang / pemecah masalah / tester head-up yang saya, proxy, berikan header itu, bukan aplikasi , tetapi aplikasi dapat menonaktifkan saya hanya dengan memberikan tajuknya sendiri. Catatan tajuk ini bukan standar - saya hanya mengada-ada, untuk membantu orang lain di tim menyadari bahwa saya menyediakan in-line ini, bukan aplikasi. Proxy sangat bebas masalah sehingga mereka memiliki kebiasaan buruk lupa bahwa mereka berada di jalan sama sekali.
Michael - sqlbot