我想将我的API(及其文档)的v1.2公开给中国的用户。 父网站mysite.mycompany.com被阻止,但1.2.3.4不是,所以我在这个地址build立一个反向代理,他们可以用来访问我的服务。
我已经configuration了一个Nginx来将http://mysite.mycompany.com代理反向到http://1.2.3.4
该代理在Firefox和IE浏览器中运行良好,但在Chrome浏览器中不起作用。 login是使用cookie进行pipe理的,但Chrome会忽略login时代理发送的Set-Cookie头,我不明白为什么。 这可以防止Chrome用户login。
父站点对login请求(其中Set-Cookie成功并且login成功)的响应标头是
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失败并且login失败)具有以下响应标头:
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
我的nginxconfiguration有趣的部分是
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; } } }
我已经尝试了caching元素closures,但它似乎并没有改变任何东西。
你有什么想法为什么Chrome可能拒绝设置代理的cookie?
原来不是nginx conf的问题 – 那很好。
问题是由于Chrome只允许从完全限定的域名来设置cookie,而不是IP地址
https://code.google.com/p/chromium/issues/detail?id=56211
我买了一个域名,把它应用到我的服务器,它的工作。 它需要对nginxconfiguration进行一次更改,本来我应该这样做,即replace这两行
proxy_cookie_domain mysite.mycompany.com $host; sub_filter "mysite.mycompany.com" $host;