当前位置:  开发笔记 > 编程语言 > 正文

有没有办法在Catalyst中强制$ c-> uri_for生成一个以https开头的URI?

如何解决《有没有办法在Catalyst中强制$c->uri_for生成一个以https开头的URI?》经验,为你挑选了2个好方法。

我使用Catalyst编写了一个Web应用程序,它有很多表单,需要在https上运行.没有硬编码的URL,一切都使用$c->uri_for$c->req->uri.使用通过http运行的开发服务器,在开发环境中一切都运行良好.

今天,当我继续部署应用程序时,我发现了一个问题.我们的生产环境目前正在设置,客户端浏览器通过HTTPS与F5负载均衡器通信,F5通过HTTP与内部网络上的Web服务器通信.

[浏览器] --- HTTPS ---> [F5] --- HTTP ---> [Web服务器]

现在,因为Web服务器只获取HTTP请求,所以从HTTP开始生成所有URI.这意味着:

变为:


现在所有浏览器都抱怨你通过不安全的连接提交数据.我需要c.uri_for以https开头.

该应用程序需要今天上线,所以我对所有表单操作进行了大规模搜索/替换:


好吧,现在打破了开发,所以我基于配置键来限制表单操作:

[% IF c.config.production %]
  
[% ELSE %]
  
[% END %]

毋庸置疑,这在多个层面上似乎都是错误的.谁有更好的主意?有没有办法强制$c->uri_for生成以https开头的URI?

如果您使用的是Catalyst 5.80008或更高版本,请设置MyApp->config(using_frontend_proxy => 1);并让代理设置X-Forwarded-Port标题.对于5.80008之前的Catalyst版本,仍然设置为using_frontend_proxy获得实际的client_ip,但要生成正确的URI,您的Web服务器将环境变量设置HTTPSON



1> zakovyrya..:

您可以尝试以下配置选项:

MyApp->config(using_frontend_proxy => 1);

它在Catalyst的文档中有描述



2> singingfish..:

以下作品(测试过):

在MyApp.pm中,添加以下子:

sub secure_uri_for {
    my ($self, @args) = @_;
    my $u = $self->uri_for(@args);
    $u->scheme('https');
    return $u;
}

现在,只要您想要保证https,就可以致电 $c->secure_uri_for('whatever')

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有