Làm cách nào để viết lại phần tên miền của Set-Cookie trong proxy ngược nginx?


26

Tôi có một proxy ngược nginx đơn giản:

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

Vấn đề là Set-Cookiecác tiêu đề phản hồi có chứa ;Domain=backend.int, bởi vì phụ trợ không biết nó đang được ủy quyền ngược.

Làm cách nào tôi có thể làm cho nginx viết lại nội dung của các Set-Cookietiêu đề phản hồi, thay thế ;Domain=backend.intbằng ;Domain=external.domain.com?

Vượt qua Hosttiêu đề không thay đổi không phải là một lựa chọn trong trường hợp này.

Apache httpd đã có tính năng này được một thời gian, ProxyPassReverseCookieDomainnhưng tôi dường như không thể tìm ra cách nào để làm điều tương tự trong nginx.


2
Tại sao vượt qua tiêu đề máy chủ không phải là một tùy chọn? imo phần máy chủ của tiêu đề được thực hiện cho những thứ như vậy. nếu bạn cần vượt qua proxy nào đã được sử dụng, bạn nên cung cấp thêm các tiêu đề.
jojoo

1
Giả sử bạn có một máy chủ cũ thực hiện lưu trữ ảo và bạn muốn đặt Nginx trước nó, để xuất bản một số dịch vụ đó trên một tên miền mới. Giả sử bạn cũng không thể (hoặc không muốn) thay đổi cấu hình của máy chủ cũ. Nginx chứa tất cả các công cụ cần thiết để xuất bản các dịch vụ cũ trên các trang web mới, ngoại trừ vấn đề tên miền cookie.
Tobia

Câu trả lời:



5

Câu trả lời từ @shamer hoạt động tốt với nhiều Set-Cookietiêu đề phản hồi, nhưng không thành công nếu chỉ có một. Như agentzh chỉ ra ở cuối chuỗi tham chiếu, if type(cookies) ~= "table" then cookies = {cookies} endlà cần thiết để xử lý trường hợp đó.

Đây là toàn bộ:

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

Câu hỏi này xuất hiện trong danh sách gửi thư nginx [1]. Không có cách nào để trực tiếp làm điều này trong nginx. Bạn phải sử dụng mô đun ngx_lua (> = v0.3.1).

Người dùng "agentzh" có một ví dụ về những gì nó sẽ trông giống như được nội tuyến trong tệp cấu hình:

    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
Cảm ơn bạn đã trả lời đúng, mặc dù trước đây tôi đã có trải nghiệm tồi với ngx_lua: rò rỉ bộ nhớ xấu. Tôi nghĩ rằng Nginx cần một số nguyên tắc thao tác tiêu đề đơn giản bằng cách sử dụng công cụ regrec dựng sẵn của nó, nếu không phải là một vài hướng dẫn tùy chỉnh khác như viết lại tên miền cookie.
Tobia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.