Desejo expor a v1.2 da minha API (e sua documentação) a usuários na China. O site pai mysite.mycompany.com
está bloqueado para eles, mas 1.2.3.4
não é, por isso estou criando um proxy reverso nesse endereço que eles podem usar para acessar meu serviço.
Configurei um Nginx para inverter o proxy http://mysite.mycompany.com
para http://1.2.3.4
O proxy funciona muito bem no Firefox e no IE, mas não no Chrome. O login é gerenciado usando cookies, mas o Chrome ignora o cabeçalho Set-Cookie enviado pelo proxy durante o login, e não entendo o motivo. Isso impede que os usuários do Chrome façam login.
Os cabeçalhos de resposta do site pai para a solicitação de login (onde o Set-Cookie é bem-sucedido e o login é bem-sucedido) são
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
enquanto o site proxy (em que Set-Cookie falha e o login não é bem-sucedido) tem os seguintes cabeçalhos de resposta:
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
A parte interessante da minha configuração do 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;
}
}
}
Eu tentei com os elementos de cache desativados, mas não parece mudar nada.
Você tem alguma ideia do motivo pelo qual o Chrome pode estar se recusando a definir o cookie do proxy?