web-dev-qa-db-ja.com

NginxプロキシCookieが設定されていません

ここに私の状況があります、私は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日間これに苦労して、すべての種類のヘッダーとさまざまな組み合わせを試しました研究は無益です。

2
Julien

最後にこれを解決しました、問題はmain.domain1.com他のドメインが使用していないときにSSLを使用していました。メインドメインでSSLを無効にしてみましたが、機能しました。他のドメインにセッションCookieが設定されました。他のドメインにSSLを追加したら、機能するかどうかを確認する必要がありますメインドメインで再び有効にしますが、そこに到達したら、そのブリッジを通過します。

1
Julien