nginx 리버스 프록시에서 Set-Cookie의 도메인 부분을 다시 쓰는 방법은 무엇입니까?


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에는 쿠키 도메인 문제를 제외하고 새 사이트에 레거시 서비스를 게시하는 데 필요한 모든 도구가 포함되어 있습니다.
Tobia

답변:



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"사용자는 구성 파일에 인라인 된 것의 예를 보여줍니다.

    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에 내장 정규 표현식 엔진을 사용하는 간단한 헤더 조작 프리미티브가 필요하다고 생각합니다.
Tobia
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.