什么是无 cookie 域?我已经多次看到这些词,但我一直不明白它是什么。
我正在尝试使用有趣的 Apache mod_rewrite 设置转换反向代理以使用 Nginx(由于外部问题,我们正在从 Apache 迁移到 Nginx,除了这部分外,大多数一切都正常)。
我最初的设置是读取 HTTP cookie(由某些应用程序设置)并根据其值将反向代理定向到不同的后端。它是这样的:
RewriteCond %{HTTP_COOKIE} proxy-target-A
RewriteRule ^/original-request/ http://backend-a/some-application [P,QSA]
RewriteCond %{HTTP_COOKIE} proxy-target-B
RewriteRule ^/original-request http://backend-b/another-application [P,QSA]
RewriteRule ^/original-request http://primary-backend/original-application [P,QSA]
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 Nginx 实现相同的目标,我的初始配置是这样的(其中“proxy_override”是 cookie 的名称):
location /original-request {
if ($cookie_proxy_override = "proxy-target-A") {
rewrite . http://backend-a/some-application;
break;
}
if ($cookie_proxy_override = "proxy-target-B") {
rewrite . http://backend-b/another-application;
break;
}
proxy_pass http://primary-backend/original-application;
}
Run Code Online (Sandbox Code Playgroud)
但它没有。我试图通过编写主代理重定向到基于${cookie_proxy_override}的内容来查看 Nginx 是否可以读取我的 cookie ,我可以看到它读取的内容很好,但ifs 似乎总是失败。
根据 Rikih 的回答,我的下一次尝试是这样的:
location /original-request {
if ($http_cookie ~ "proxy-target-A") …Run Code Online (Sandbox Code Playgroud) 我最近遇到了某种安全设备 (BlueCoat),它要求所有到 Internet 的连接都必须通过它进行代理(你好,中间人),因此使用特殊的 SSL 证书来拦截所有流量。
这阻止了 Git 的正常操作,即使设置了适当的http.proxy和http.sslCAInfo属性以确保 SSL 连接本身有效。
使用环境变量GIT_CURL_VERBOSE=1,我们发现在使用时git clone,会出现HTTP 407(需要代理认证)。Git 正确完成此身份验证,最后,设备返回带有 cookie 标头的 HTTP 200 Set-Cookie。
Git 然后将连接到目标服务器,但没有cookie,导致 HTTP 401。
解决这个问题的方法是设置git配置选项 http.saveCookies=true
问题: 中间代理添加cookies真的是RFC标准允许的吗?
Anthony Rich向 http-state 邮件列表提出了同样的问题,但没有任何回应。他确实注意到在
RFC 2965 HTTP 状态管理机制,3.5 缓存代理角色它说:代理不得在代理响应(请求)中引入自己的 Set-Cookie2 (Cookie) 标头。
但是,取代的 RFC 6265根本不再提及这一点。
在我的网站上,我使用Haproxy负载均衡器将使用移动设备的用户重定向到移动网站。我对此有一些抱怨,并希望为用户提供一个返回“经典”门户的链接。由于并非所有子页面都以移动格式提供,因此我必须首先选择内容是否可用。
acl path_root path /
acl path_mobile path_beg /faq
acl site_classic hdr_sub(cookie) CLASSIC=
acl ua_smartphone hdr_reg(User-Agent) -i iphone ipod android bada
redirect location http://s.tld if path_root ua_smartphone !site_classic
redirect prefix http://s.tld if path_mobile ua_smartphone !site_classic
Run Code Online (Sandbox Code Playgroud)
如果用户进入顶级目录,只需重定向该位置。如果“移动”用户点击移动格式中可用的内容,则重定向包括完整路径。到目前为止,这一切都很好。
现在,当他/她单击移动版本中设置名为“CLASSIC”的 cookie 的链接时,我不想再重定向用户。
cookie 设置正确并且工作正常。如果我写以下重定向工作:
acl site_classic hdr_sub(cookie) CLASSIC=
redirect location http://s.tld if site_classic
Run Code Online (Sandbox Code Playgroud)
我还尝试了所有可以想到的检查 cookie 的方法,例如 CLASSIC=1 CLASSIC=true CLASSIC=portal 等,并在代码中
acl site_classic hdr_sub(cookie) CLASSIC
acl site_classic hdr_sub(cookie) CLASSIC=
acl site_classic hdr_sub(cookie) CLASSIC=1
acl site_classic hdr_sub(cookie) CLASSIC=true
acl site_classic hdr_sub(cookie) CLASSIC=portal
Run Code Online (Sandbox Code Playgroud)
为什么它不起作用? …
我在网站上使用 Apache 2.2.29。apache 既可以为来自 Drupal 的页面提供服务,也可以作为内部应用程序服务器的反向代理。出于安全原因,我们希望为发送给客户端的所有 cookie 添加标志 HttpOnly 和安全。为了做到这一点,我在 apache 中设置了以下规则
Header edit Set-Cookie "(?i)^((?:(?!;\s?HttpOnly).)+)$" "$1; HttpOnly"
Header edit Set-Cookie "(?i)^((?:(?!;\s?secure).)+)$" "$1; secure"
Run Code Online (Sandbox Code Playgroud)
对于某些 cookie,这工作正常,但其他 cookie 没有被修改。查看响应标题,我看到以下内容:
HTTP/1.1 200 OK
Date: Thu, 20 Nov 2014 22:50:01 GMT
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Thu, 20 Nov 2014 22:50:01 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Set-Cookie: SESSbfb02014bca2e49545c2cacd8a8cfcfa=perqn1l3mn2saselmabnn4vla7; expires=Sun, 14-Dec-2014 02:23:21 GMT; path=/; domain=.www6.server.com; HttpOnly; secure
Set-Cookie: textsize=100; expires=Fri, 20-Nov-2015 22:50:02 GMT; path=/; HttpOnly; secure
X-Cnection: close …Run Code Online (Sandbox Code Playgroud) 我似乎无法让 Apache 指令ProxyPassReverseCookieDomain实际重写域。
我的指令设置如下:
ProxyPassReverseCookieDomain "myinternalproxydomain.com" "thepublicdomain.com"
Run Code Online (Sandbox Code Playgroud)
我使用浏览器中的“网络”选项卡,可以看到Set-Cookie域没有被更改。我将 Set-Cookie 域视为thepublicdomain.com或.thepublicdomain.com。我尝试过添加
ProxyPassReverseCookieDomain "myinternalproxydomain.com" ".thepublicdomain.com"
Run Code Online (Sandbox Code Playgroud)
我已经搜索并阅读了文档,但是我不明白为什么没有设置 cookie 的域。
<VirtualHost *:443>
DocumentRoot /var/www/myinternalproxydomain.com
ServerName myinternalproxydomain.com
SSLEngine on
SSLCertificateFile /etc/ssl/certs/my.crt
SSLCertificateKeyFile /etc/ssl/private/my.key
SSLCACertificateFile /etc/ssl/certs/my.ca-bundle
SSLProxyEngine On
ProxyRequests Off
ProxyHTMLEnable On
ProxyPreserveHost Off
ProxyHTMLInterp On
ProxyHTMLExtended On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ProxyPass "/" "https://thepublicdomain.com/"
ProxyPassReverse / https://thepublicdomain.com/
ProxyPassReverseCookiePath / /
ProxyPassReverseCookieDomain "myinternalproxydomain.com" "thepublicdomain.com"
ProxyPassReverseCookieDomain "myinternalproxydomain.com" "thepublicdomain.com"
ProxyPassReverseCookieDomain "myinternalproxydomain.com" ".thepublicdomain.com"
DirectorySlash On
ProxyHTMLURLMap "https://thepublicdomain.com" …Run Code Online (Sandbox Code Playgroud) cookie ×6
proxy ×2
apache-2.2 ×1
apache-2.4 ×1
cookieless ×1
domain ×1
haproxy ×1
http ×1
http-headers ×1
mod-rewrite ×1
nginx ×1
redirect ×1
web ×1