web-dev-qa-db-ja.com

nginxリバースプロキシでSet-Cookieのドメイン部分を書き換える方法

単純な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で同じことを行う方法を見つけることができないようです。

27
Tobia

1.1.15以降、この問題に対処するためにproxy_cookie_domainオプションが追加されました。

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_domain

22
rrehbein

@ shamerからの回答 は、複数の_Set-Cookie_応答ヘッダーで正常に動作しますが、1つしかない場合は失敗します。参照されたスレッドの最後で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 
    '; 
}
_
5
lhagan

この質問は、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
shamer