単純な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で同じことを行う方法を見つけることができないようです。
1.1.15以降、この問題に対処するためにproxy_cookie_domainオプションが追加されました。
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_domain
@ 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
';
}
_
この質問は、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
';
}