ここに私の状況があります、私はRails 4つのアプリを持っています。これは複数のドメインからアクセスでき、ドメインによってはコンテンツが変化します。
メインドメインがdomain1
で、他のすべてのドメインがNginxのproxy_pass
を使用してリクエストをdomain1
に転送するとします。これは、セッションや他のCookieが設定されていないことを除いて、すべて正常に機能していますdomain2
。
私のRailsアプリでは、domain
ヘッダーのコンテンツを使用してアプリにアクセスしているドメインに応じて、セッションのCUSTOMHEADER
を動的に設定するミドルウェアを作成しました。 -cookieヘッダーがcookieドメインが正しいため、私の問題はNginx構成にあると思いますが、残念ながら、Nginxの知識はかなり限られています。
Nginx設定
以下は、domain2
のホストファイルの例です(Cookieが設定されていないサンプルドメインの1つ)。
server {
listen 80;
server_name domain2.com;
rewrite ^(.*) http://www.domain2.com$1 permanent;
}
server {
listen 80;
server_name www.domain2.com;
location /assets/ {
proxy_pass https://main.domain1.com/assets/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
proxy_set_header CUSTOMHEADER www.domain2.com;
proxy_pass_request_headers on;
}
location /some_path/ {
proxy_pass https://main.domain1.com/some_path/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
proxy_set_header CUSTOMHEADER www.domain2.com;
proxy_pass_request_headers on;
}
location / {
proxy_pass https://main.domain1.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
proxy_set_header CUSTOMHEADER www.domain2.com;
proxy_pass_request_headers on;
rewrite ^/(.*)$ /sites/some-id/$1 break;
}
}
ブラウザーでページを開いてヘッダーを検査すると、次のようになります(Chromeの場合)。
応答ヘッダー
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Mon, 05 Nov 2018 22:21:45 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
Status: 200 OK
Cache-Control: max-age=0, private, must-revalidate
Strict-Transport-Security: max-age=31536000
X-XSS-Protection: 1; mode=block
X-Request-Id: 33d26df0-f44c-4ff5-9513-62aaade8c581
ETag: W/"3dd8553b2a02cfc9f85a609c5f90bafb"
X-Frame-Options: SAMEORIGIN
X-Runtime: 0.025616
X-Content-Type-Options: nosniff
Set-Cookie: _myapp_session=dmNFR2...3ae445b; domain=www.domain2.com; path=/; secure; HttpOnly
X-Powered-By: Phusion Passenger 5.1.2
Content-Encoding: gzip
リクエストヘッダー
GET /login HTTP/1.1
Host: www.domain2.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://www.domain2.com/bla
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,pt;q=0.8,fr;q=0.7
If-None-Match: W/"09c9ac3842dd3942a006b9000bd7a29d"
ご覧のとおり、ResponseにはSet-Cookie
ヘッダーが含まれており、Cookieには正しいドメインが設定されていますが、Cookieはブラウザーによって設定されることはなく、リクエストにCookie
ヘッダーが含まれていないことにも気づくでしょう。送信するCookieがないためです。
注1:Railsアプリからの応答に次のヘッダーを設定しようとしましたが、それは役に立ちませんでした:
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
注2:ブラウザーが特大の場合はCookieを作成しないことはわかっていますが、Cookieのサイズは最大値から離れている必要があるため、ここでは問題ではないと思います。
メインドメイン(http://main.domain1.com
)にアクセスすると、セッションは正常に動作しますが、ここで何が欠けていますか?私はNginxまたはWebサーバーに関する一般的な理論的な知識が不足しているように感じますが、これを正しく行うことができませんが、3日間これに苦労して、すべての種類のヘッダーとさまざまな組み合わせを試しました研究は無益です。
最後にこれを解決しました、問題はmain.domain1.com
他のドメインが使用していないときにSSLを使用していました。メインドメインでSSLを無効にしてみましたが、機能しました。他のドメインにセッションCookieが設定されました。他のドメインにSSLを追加したら、機能するかどうかを確認する必要がありますメインドメインで再び有効にしますが、そこに到達したら、そのブリッジを通過します。