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

Chrome игнорирует директиву Set-Cookie из обратного прокси-сервера nginx

Я хочу показать версию 1.2 моего API (и документацию к нему) пользователям в Китае. Родительский сайт mysite.mycompany.com заблокирован для них, но 1.2.3.4 нет, поэтому я создаю обратный прокси по этому адресу, который они могут использовать для доступа к моей службе.

Я настроил Nginx для обратного прокси http://mysite.mycompany.com к http://1.2.3.4

Прокси-сервер отлично работает в Firefox и IE, но не в Chrome. Вход осуществляется с помощью файлов cookie, но Chrome игнорирует заголовок Set-Cookie, отправленный прокси-сервером во время входа в систему, и я не понимаю, почему. Это не позволяет пользователям Chrome входить в систему.

Заголовки ответа родительского сайта на запрос входа (где Set-Cookie успешны, а вход в систему успешен):

HTTP/1.1 302 Found
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
Content-Type: text/html; charset=UTF-8
Date: Tue, 12 Aug 2014 18:16:57 GMT
ETag: "1407867417"
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Tue, 12 Aug 2014 18:16:57 +0000
Location: http://mysite.mycompany.com/user/me/apps
Server: Apache
X-Powered-By: PHP/5.3.15
Content-Length: 0
Connection: Keep-Alive
Set-Cookie: SESS25fe1d0b3b7239f403e22223da0614cf=Oo-PXr4XYQCFUKYUyZgX3UJpWADAhF_q7Xf-8gko3BU; expires=Thu, 04-Sep-2014 21:50:17 GMT; path=/; domain=.mysite.mycompany.com; HttpOnly

в то время как прокси-сайт (где Set-Cookie не работает и вход в систему не успешен) имеет следующие заголовки ответа:

HTTP/1.1 302 Found
Server: nginx/1.4.7
Date: Tue, 12 Aug 2014 18:57:42 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Location: http://1.2.3.4/user/me/apps
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
ETag: "1407869862"
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Tue, 12 Aug 2014 18:57:42 +0000
X-Powered-By: PHP/5.3.15
Connection: Keep-Alive
Set-Cookie: SESS25fe1d0b3b7239f403e22223da0614cf=DrY_4Y1NUPdIv9MsXPMjCr7Bzkq7DjyOmQPcNhetKXU; expires=Thu, 04-Sep-2014 22:31:02 GMT; path=/; domain=.1.2.3.4; HttpOnly

Интересная часть моей конфигурации nginx:

http {
    # Ngnix defaults up to here then

    proxy_cache_path /var/spool/nginx keys_zone=CACHE:20m levels=1:2 inactive=6h max_size=1g;

    server {
        listen  80;


        location /v1.2/ {
                proxy_pass  http://api.mysite.mycompany.com/v1.2/;
                proxy_set_header  X-Real-IP    $remote_addr;
                proxy_set_header  X-Real-HOST  $host;
        }


        location / {
                proxy_pass      http://mysite.mycompany.com;
                # Required to prevent the host serving gzipped pages that can't be modified with sub_filter
                proxy_set_header        Accept-Encoding ''; 
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Real-HOST  $host;
                proxy_cookie_domain     mysite.mycompany.com     1.2.3.4;
                sub_filter      "mysite.mycompany.com"   "1.2.3.4";
                sub_filter_once off;
                proxy_cache     CACHE;
        }

    }

}

Я пробовал с отключенными элементами кеширования, но вроде ничего не меняет.

Вы хоть представляете, почему Chrome может отказываться устанавливать cookie прокси?

Оказалось, что проблем с конфигурированием nginx не возникло - все нормально.

Проблема связана с тем, что Chrome позволяет устанавливать файлы cookie только для полностью определенных доменных имен, а не для IP-адресов.

https://code.google.com/p/chromium/issues/detail?id=56211

Я купил доменное имя, применил его к своему серверу, и оно сработало. Потребовалось одно изменение в конфигурации nginx, которое я должен был сделать изначально, а именно заменить эти две строки

            proxy_cookie_domain     mysite.mycompany.com     $host;
            sub_filter      "mysite.mycompany.com"   $host;