原文地址: Nginx 中 proxy_cookie_path 的用法
欢迎访问我的博客: http://blog.duhbb.com/
昨天调试 nginx 的时候, 转发都配置好了, 结果登录之后又跳到了登录页面, 顿时一脸懵逼;然后在别的地方看了下配置, 拷贝过来之后就可以正常登录的. 而拷贝过来的配置的一个关键的指令就是 proxy_cookie_path, 这不禁引起了我的好奇, 遂撰此文记录, 避免下次踩坑.
下面的这个介绍部分参考了这个博客: https://cloud.tencent.com/developer/article/1858199
proxy_cookie_path source target;
cookie 的 path 与地址栏上的 path 不一致, 浏览器就不会接受这个 cookie, 无法传入 JSESSIONID 的 cookie, 导致登录验证失败.
当 nginx 配置的反向代理的路径和源地址路径不一致时使用.
# elastic-job 代理配置
location /etc-job/api/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://10.55.3.139:8088/api/;
proxy_cookie_path / /etc-job/api/;
proxy_set_header Cookie $http_cookie;
}
感觉说的不是很清楚, 笔者还是看下 nginx 的官方文档吧!
官方介绍的地址如下: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_path
语法:
proxy_cookie_path off;
proxy_cookie_path path replacement;
# 二者选其一或者同时存在, 同时存在就是 off 了
默认:
proxy_cookie_path off;
上下文:
http, server, location
这个指令是从 1.1.15 版本开始引入的.
可以设置被代理服务器响应中的 Set-Cookie 这个路径属性. 假被设代理服务器返回的 Set-Cookie 头的 path 字段的属性是 path=/two/some/uri/.
那么这个指令 proxy_cookie_path /two/ /; 会将这个属性重写为 path=/some/uri/.
我感觉这个就是一种替换, 将
/two/替换为/了
path 和 replacement 可以包含变量: proxy_cookie_path $uri /some$uri;
The directive can also be specified using regular expressions. In this case, path should either start from the ~ symbol for a case-sensitive matching, or from the ~* symbols for case-insensitive matching. The regular expression can contain named and positional captures, and replacement can reference them:
proxy_cookie_path ~*^/user/([^/]+) /u/$1;
同一级可以指定多个 proxy_cookie_path 指令:
proxy_cookie_path /one/ /;
proxy_cookie_path / /two/;
如果有多个指令都可以匹配上 cookie 的路径,nginx 会选择第一个匹配的指令.
off 参数会将所有继承的 proxy_cookie_path 都取消掉.
其实很简单, chrome F12 打开调试, 然后登录之后, 就可以看到接口 set-cookie 的响应了, 如下图

如果这个 path 和浏览器地址栏的不一致, 浏览器会拒绝写入这个 cookie, 相当于登陆了个寂寞.
原文地址: Nginx 中 proxy_cookie_path 的用法
欢迎访问我的博客: http://blog.duhbb.com/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我在rubyonrails应用程序中有以下新方法:defnewifcookies[:owner].empty?cookies[:owner]=SecureRandom.hexend@movie=Movie.new@movie.owner=cookies[:owner]end基本上,每个新用户都应该获得一个代码来识别他们(尽管只是通过cookie)。因此,当用户创建电影时,创建的cookie将存储在owner字段中。所以有两个问题:使用.empty?方法,当我从浏览器中删除cookie时,返回一个undefinedmethodempty?'对于nil:NilClass`当我确实已经在
在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O
-if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc
A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(
request.cookies和RubyonRails中的cookies对象有区别吗?我目前正在尝试将带有cookie的请求从我的node.js服务器发送到我的ROR4应用程序。似乎在ROR应用程序中,request.cookies包含我发送的cookie,但是cookies对象(现有逻辑所基于的对象)没有它。我已经搜索了文档,但找不到任何相关内容。我错过了什么吗?感谢您的帮助。 最佳答案 理想情况下,request.cookies和cookies应该相同。但是,在POST(创建操作)请求中,rails会验证XSRFtoken。如果
我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject
我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有
我发现ruby加载路径是一个数组,很多项目都是这样使用的:$:.unshift(File.expand_path("../../lib",__FILE__))可以将本地文件添加到ruby路径数组的前面,方便我们require或者load。所以,我希望知道为什么我们不使用push将文件添加到数组的末尾? 最佳答案 假设您有一个“date.rb”文件(为什么不呢)并且您想要加载这个文件,而不是标准库日期。如果您使用追加,当您调用require'date'时您的文件将永远不会被加载,因为它位于数组的末尾并且标准日期会在之前找到。因此,如果
有什么方法可以为url/path助手提供默认值吗?我有一个可选范围环绕我的所有路线:#config/routes.rbFoo::Application.routes.drawdoscope"(:current_brand)",:constraints=>{:current_brand=>/(foo)|(bar)/}do#...allotherroutesgohereendend我希望用户能够使用这些URL访问网站:/foo/some-place/bar/some-place/some-place为了方便起见,我在我的ApplicationController中设置了一个@current