Вот моя ситуация, у меня есть приложение 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, но это не помогло:
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Заметка 2: Я знаю, что браузер не будет создавать cookie, если он слишком большой, но размер cookie должен быть далеко от максимального, поэтому я не думаю, что здесь проблема.
Сеанс отлично работает при доступе к основному домену (http://main.domain1.com
), что мне здесь не хватает? Я чувствую, что мне не хватает некоторых теоретических знаний о Nginx или веб-серверах в целом, что мешает мне понять это правильно, но я боролся с этим в течение 3 дней, пробовал всевозможные заголовки и различные комбинации и до сих пор все мои исследования бесплодны.
Наконец решил это, проблема заключалась в том, что main.domain1.com
использовал SSL, в то время как другие домены не использовались, я попытался отключить SSL в основном домене, и это сработало, в других доменах наконец-то были файлы cookie сеанса, мне нужно будет посмотреть, работает ли он, когда я добавлю SSL к другим доменам и повторно -включите его в основном домене, но я перейду через этот мост, когда доберусь туда.