Nginx прокси-куки не установлены

Вот моя ситуация, у меня есть приложение Rails 4, к которому могут обращаться несколько доменов, в зависимости от домена, контент меняется.

Скажем, основной домен domain1 а все остальные домены просто используют Nginx proxy_pass направить запросы domain1, это все работает нормально, за исключением того, что сеанс или другие файлы cookie не установлены для domain2,

В своем приложении Rails я создал промежуточное ПО, которое динамически устанавливает domain для сеанса в зависимости от того, какой домен обращается к приложению, используя содержимое CUSTOMHEADER заголовок, и я вижу в заголовке Set-Cookie, что домен cookie правильный, поэтому я думаю, что моя проблема в моей конфигурации Nginx, но, к сожалению, мои знания Nginx весьма ограничены.

Конфигурация Nginx

Ниже приведен пример файла хоста для domain2 (один из примеров доменов, где куки не установлены):

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"

Как вы видите ответ содержит 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 или веб-серверах в целом, что мешает мне сделать это правильно, но я боролся с этим в течение 3 дней, пробовал всевозможные заголовки и различные комбинации и пока что все мои исследования бесплодны.

1 ответ

Решение

Наконец, это решено, проблема заключалась в том, что main.domain1.com использовал SSL, в то время как другие домены не были, я попытался отключить SSL на главном домене, и это сработало, у других доменов наконец были сеансовые куки, мне нужно будет проверить, работает ли он, как только я добавлю SSL к другим доменам и -Включить его в основном домене, но я перейду тот мост, как только доберусь туда.

Другие вопросы по тегам