วิธีเขียนส่วนโดเมนของ Set-Cookie ในพร็อกซีย้อนกลับ nginx ได้อย่างไร


26

ฉันมีพร็อกซีย้อนกลับ nginx อย่างง่าย:

server {
  server_name external.domain.com;
  location / {
    proxy_pass http://backend.int/;
  }
}

ปัญหาคือว่าSet-Cookieส่วนหัวของการตอบสนองมี;Domain=backend.intเพราะส่วนแบ็กเอนด์ไม่ทราบว่ามันกำลังถูกพร็อกซีย้อนกลับ

ฉันจะทำให้ nginx เขียนเนื้อหาของSet-Cookieส่วนหัวการตอบกลับแทนที่;Domain=backend.intด้วยได้;Domain=external.domain.comอย่างไร

การผ่านHostส่วนหัวไม่เปลี่ยนแปลงไม่ได้เป็นตัวเลือกในกรณีนี้

Apache httpdมีคุณสมบัตินี้อยู่ครู่หนึ่งดูProxyPassReverseCookieDomainแต่ฉันไม่สามารถหาวิธีที่จะทำได้ใน nginx


2
เหตุใดการผ่านส่วนหัวของโฮสต์จึงไม่ใช่ตัวเลือก imo ส่วนโฮสต์ของส่วนหัวถูกสร้างขึ้นเพื่อสิ่งต่าง ๆ หากคุณต้องการส่งผ่านพร็อกซีที่ใช้คุณควรจัดหาส่วนหัวเพิ่มเติม
jojoo

1
สมมติว่าคุณมีเซิร์ฟเวอร์ดั้งเดิมที่ทำหน้าที่โฮสต์เสมือนและคุณต้องการวาง Nginx ไว้ข้างหน้าเพื่อเผยแพร่บริการเหล่านั้นบางส่วนในโดเมนใหม่ สมมติว่าคุณไม่สามารถ (หรือไม่ต้องการ) เปลี่ยนการกำหนดค่าเซิร์ฟเวอร์ดั้งเดิม Nginx มีเครื่องมือทั้งหมดที่จำเป็นในการเผยแพร่บริการดั้งเดิมในไซต์ใหม่ยกเว้นปัญหาโดเมนคุกกี้
เบีย

คำตอบ:



5

คำตอบจาก @shamerทำงานได้ดีกับSet-Cookieส่วนหัวการตอบกลับที่หลากหลายแต่ก็ล้มเหลวหากมีเพียงส่วนเดียว ในฐานะที่เป็น agentzh ชี้ให้เห็นในตอนท้ายของหัวข้ออ้างอิงที่if type(cookies) ~= "table" then cookies = {cookies} endจำเป็นในการจัดการกรณีที่

นี่คือสิ่งทั้งหมด:

location / { 
    proxy_pass http://backend.int/;

    header_filter_by_lua '
        local cookies = ngx.header.set_cookie 
        if not cookies then return end
        if type(cookies) ~= "table" then cookies = {cookies} end
        local newcookies = {}
        for i, val in ipairs(cookies) do
            local newval = string.gsub(val, "([dD]omain)=[%w_-\\\\.]+", 
                      "%1=external.domain.com") 
            table.insert(newcookies, newval) 
        end 
        ngx.header.set_cookie = newcookies 
    '; 
}

2

คำถามนี้เกิดขึ้นในรายชื่อผู้รับจดหมายของ nginx [1] ไม่มีวิธีการทำสิ่งนี้โดยตรงใน nginx คุณต้องใช้โมดูล ngx_lua (> = v0.3.1)

ผู้ใช้ "agentzh" มีตัวอย่างของสิ่งนี้จะดูเหมือน inlined ในไฟล์ config:

    server_name external.domain.com; 

    location / { 
        proxy_pass http://backend.int/;

        header_filter_by_lua ' 
            local cookies = ngx.header.set_cookie 
            if not cookies then return end 
            local newcookies = {} 
            for i, val in ipairs(cookies) do 
                local newval = string.gsub(val, "([dD]omain)=[%w_-\\\\.]+", 
                          "%1=external.domain.com") 
                table.insert(newcookies, newval) 
            end 
            ngx.header.set_cookie = newcookies 
        '; 
    } 

[1] http://nginx.2469901.n2.nabble.com/Rewriting-the-domain-part-of-Set-Cookie-in-a-proxy-pass-td6453554.html


2
ขอบคุณสำหรับคำตอบที่ถูกต้องแม้ว่าฉันเคยมีประสบการณ์ที่ไม่ดีกับ ngx_lua ในอดีต: การรั่วไหลของหน่วยความจำไม่ดี ฉันคิดว่า Nginx ต้องการพื้นฐานการจัดการส่วนหัวแบบง่าย ๆ โดยใช้เอ็นจิน regin ของ builtin หากไม่ได้มีคำแนะนำที่กำหนดเองเพิ่มเติมเช่นการเขียนโดเมนคุกกี้อีกครั้ง
เบีย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.