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.