Назад | Перейти на главную страницу

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

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

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

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

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

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

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, но это не помогло:

Заметка 2: Я знаю, что браузер не будет создавать cookie, если он слишком большой, но размер cookie должен быть далеко от максимального, поэтому я не думаю, что здесь проблема.

Сеанс отлично работает при доступе к основному домену (http://main.domain1.com), что мне здесь не хватает? Я чувствую, что мне не хватает некоторых теоретических знаний о Nginx или веб-серверах в целом, что мешает мне понять это правильно, но я боролся с этим в течение 3 дней, пробовал всевозможные заголовки и различные комбинации и до сих пор все мои исследования бесплодны.

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