使用ngrok进行头部重写时无法创建cookie

10

我使用Docker作为本地开发环境,并使用 dinghy-http-proxy 将新的TLD .docker 添加到映射请求的 nginx-proxy 容器。

我的网站通常通过类似http://devel.domain.com.docker的URL访问。

我想在本地开发时使用ngrok同时访问远程webhooks。

我成功启动了ngrok命令:

ngrok http -host-header=rewrite devel.domain.com.docker 80

我可以通过地址http://randomsubdomain.ngrok.io访问我的Web应用程序的登录表单。

然而,我无法登录,因为似乎无法设置cookie会话。

实际上,尝试为域devel.domain.com.docker设置cookie会话,但由于我们在浏览器中使用randomsubdomain.ngrok.io,所以出于安全原因被阻止。

我该如何解决这个问题?我的配置是否有误?ngrok是我想要实现的正确工具吗?

2个回答

16

直接向ngrok.io支持团队询问,并得到了以下回答:

不,你没有遗漏任何内容,那只是重写主机头的不幸副作用。由于存在像这样的复杂情况(以及涉及JavaScript和跨域等其他情况),主机头重写仅适用于某些应用程序。如果可能的话,最好重新配置您的网站以接受ngrok.io的主机头。

但是,我通过检查请求头中是否包含x-original-host域名ngrok.io,然后修改会话机制(PHP中的session_set_cookie_params)来使用x-original-host域名替代它。


1
哇,谢谢你发布这个!我刚刚花了8个小时试图弄清楚为什么我的cookie没有持久化。然而,在我的情况下,我正在使用Ruby on Rails,而cookie没有持久化是因为我简单地没有指定-host-header=rewrite。添加了这个之后,它完美地工作了。 - Peter P.
4
更深入的了解:我在尝试使用它时遇到了更多问题,并意识到它在Chrome浏览器中无法工作,但在Firefox中可以!我向ngrok询问了这个问题,Alan说:“是Chrome的安全设置吧?但我从来没有研究过正确的标志如何关闭。” 让它在Chrome中正常运行的正确方法是将domain=.ngrok.io更改为domain=mydomain.ngrok.io - 我意识到我正在使用Rails,并且我的cookie设置中有一个选项domain: :all。我在开发环境中将其删除后,现在它完美地工作了! - Peter P.
4
以前,在我的Rails应用程序的会话存储配置中使用domain:all设置时,ngrok对我起作用。但最近我在ngrok和子域方面遇到了类似的问题。来自@PeterP的上述评论帮助了我。现在我只需为本地测试设置domain:'mydomain.ngrok.io',而不是:all - Rohan Daxini

0

正如mperrin所说,您必须更改php cookie会话机制。

session_set_cookie_params中阅读:

设置在php.ini文件中定义的cookie参数。此函数的效果仅在脚本运行期间持续。因此,您需要为每个请求调用session_set_cookie_params(),并在调用session_start()之前调用它。

最重要的参数是$domain,为了使ngrok同样有效,您还可以在session_start()之前使用ini_set()命令(请参见ini_set):ini_set('session.cookie_domain', 'xxx.ngrok.io');

这对于我自己的PHP托管平台也花费了几个小时来解决,但我知道我的认证子系统应该在除localhost之外的有效主机名下工作,因此我专注于如何从我的代码中设置cookie。

任何优秀的php框架都应该提前设置这种php环境设置,而这也是我开始构建它的主要目标之一(在我的情况下,我只需要在服务器上更改json文本文件中的值)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接