Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
播放框架HTTPS代理_Https_Playframework - Fatal编程技术网

播放框架HTTPS代理

播放框架HTTPS代理,https,playframework,Https,Playframework,我有一个剧本!需要使用HTTP和HTTPS的应用程序。应用程序运行在代理服务器(使用Apache)后面,代理服务器将web请求转发给play应用程序 代理将一个端口用于HTTP请求,另一个端口用于HTTPs请求。请注意,代理上的端口与播放应用程序使用的端口不同(这是由于提供商限制!) Play应用程序正在使用HTTP的“标准”端口9000和HTTPs的“标准”端口9443。代理在端口8080上接收HTTP请求,并将其转发到Play的端口9000。代理在端口8090上接收HTTPs请求,并将其转发

我有一个剧本!需要使用HTTP和HTTPS的应用程序。应用程序运行在代理服务器(使用Apache)后面,代理服务器将web请求转发给play应用程序

代理将一个端口用于HTTP请求,另一个端口用于HTTPs请求。请注意,代理上的端口与播放应用程序使用的端口不同(这是由于提供商限制!)

Play应用程序正在使用HTTP的“标准”端口9000和HTTPs的“标准”端口9443。代理在端口8080上接收HTTP请求,并将其转发到Play的端口9000。代理在端口8090上接收HTTPs请求,并将其转发到Play的端口9443

我的问题是,当我使用secure()方法使页面显示在Play中时,Play的逻辑会导致应用程序尝试使用9443作为HTTPs的端口。这会导致请求丢失,因为代理正在使用其他端口

当我想从HTTPs切换到HTTP时,也会发生同样的情况。我似乎无法使系统转到代理使用的端口

不知何故,我需要让系统转到代理服务器已知的端口,而不会破坏我的路由。有没有办法做到这一点


提前感谢您提供的任何帮助/见解。

Play应识别请求来自的端口,并使用该端口。您的apache配置可能未正确设置

您是否在apache配置中添加了以下行

ProxyPreserveHost on

您可能还需要
XForwardedSupport=127.0.0.1
,具体取决于您的服务器配置。

Play应识别请求来自的端口,并使用该端口。您的apache配置可能未正确设置

您是否在apache配置中添加了以下行

ProxyPreserveHost on
您可能还需要
XForwardedSupport=127.0.0.1
,具体取决于您的服务器配置。

我已经找到了自己的“答案”,尽管它有些模糊

事实证明,根据我从文档中了解到的情况,当Play应用程序位于代理之后时,实际上没有办法告诉Play在端口之间切换。这是因为,虽然Play可以识别请求进入的端口,但在安全端口和非安全端口之间切换时,它无法判断应该使用哪个代理端口。例如,它知道HTTP请求通过代理端口8080发出,并且它知道对其端口9000的后续请求将来自该代理端口。当有人试图使用https访问其端口9443时,它不知道要做的是切换到另一个代理端口。因此,如果您有一个类似
http://toproxy:8080/links
如果有一个或多个链接使用secure()方法激活https,则Play将解析该链接为
https://toproxy:8080
——尽管代理服务器可能希望将端口8090用于HTTPS请求。因为代理端口8080被重定向到Play的端口9000,所以将该端口用于HTTPS请求总是失败。在游戏2.0和游戏1.X中都是如此

我相信Play需要一些标准配置参数,可以告诉它将代理端口映射到HTTP和HTTPS端口。这样,当它位于代理服务器后面时,开发人员可以使用secure()方法,Play将能够将URL解析到正确的代理端口。该功能应在1.X版和2版中提供

在有人真正实现这一点之前(如果我有时间的话,我可能会这么做,但我所做的一切都不应该让人们屏住呼吸),我的建议是简单地使用redirect()方法在HTTP和HTTPS代理端口之间切换。redirect()方法显然允许我们输入完整的URL,因此我只需调用切换请求的页面的完整URL

例如:在上述页面中
http://toproxy:8080/links
,我可能有一个指向要使用HTTPS保护的登录页面的链接。为此,我创建了两个操作:一个用于重定向到代理HTTPS端口(在本例中,将其称为gotogin()),另一个用于实际呈现登录页面(在本例中,将其称为loginPage(),并为其提供/loginPage的路由)

在gotoLogin()中,我以以下方式重定向到loginPage:

重定向(“https://toproxy:8090/loginpage");

这使得Play在代理端口8090上进入,该端口被重定向到Play的端口9443

当用户正确登录时,我的身份验证操作只需使用另一个redirect()调用:

重定向(“http://toproxy:8080/destination_page");

这会使Play返回到不安全请求的正确代理端口

这不是解决这个问题的最好办法。代理服务器可能会以某种方式配置为在HTTP和HTTPS端口之间进行适当的切换,但对于不擅长代理服务器配置的人(这就是我!),调查这一点可能需要一些时间。当然,最好的解决方案是在游戏中实现我前面描述的那种代理端口处理

但是这个解决方案是有效的,可以适应许多不同的情况。除非有人提出另一个更好的解决方案,否则这个解决方案就是我正在使用的解决方案。

我已经找到了我自己的“答案”,尽管它有点模糊

事实证明,根据我从文档中了解到的情况,当Play应用程序位于代理之后时,实际上没有办法告诉Play在端口之间切换。这是因为,虽然Play可以识别请求进入的端口,但在安全端口和非安全端口之间切换时,它无法判断应该使用哪个代理端口。例如,它知道HTTP请求通过代理端口8080发出,并且它知道对其端口9000的后续请求将来自该代理端口。它不知道要做的是,当有人试图使用https访问时,切换到另一个代理端口