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


26

私はシンプルなnginxリバースプロキシを持っています:

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

問題は、バックエンドがそれが逆プロキシされていることを知らないため、Set-Cookie応答ヘッダーにが含まれて;Domain=backend.intいることです。

Set-Cookieに置き換え;Domain=backend.intて、応答ヘッダーのコンテンツをnginxに書き換えさせるにはどうすればよい;Domain=external.domain.comですか?

Hostこの場合、ヘッダーを変更せずに渡すことはオプションではありません。

Apache httpdにはしばらくの間この機能がありましたが、を参照してくださいProxyPassReverseCookieDomain。しかし、nginxで同じことを行う方法を見つけることができないようです。


2
ホストヘッダーを渡すことがオプションではないのはなぜですか?imoヘッダーのホスト部分は、こうしたことのために作られています。使用されたプロキシを渡す必要がある場合は、追加のヘッダーを指定する必要があります。
ジョジョ

1
仮想ホスティングを行うレガシーサーバーがあり、その前にNginxを配置して、これらのサービスの一部を新しいドメインに公開するとします。また、レガシーサーバーの構成を変更できない(または変更したくない)と仮定します。Nginxには、Cookieドメインの問題を除き、新しいサイトでレガシーサービスを公開するために必要なすべてのツールが含まれています。
トビア

回答:



5

@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 
    '; 
}

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には、組み込みの正規表現エンジンを使用した単純なヘッダー操作プリミティブが必要であると思いますが、Cookieドメインの書き換えなどのカスタム命令はもう少し必要です。
トビア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.