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

mhc*_*hry 8 perl catalyst

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

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

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

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

<form action='[% c.uri_for('/secure/form') %]' method='post'>
Run Code Online (Sandbox Code Playgroud)

变为:

<form action='http://websitename.org/secure/form' method='post'>
Run Code Online (Sandbox Code Playgroud)

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

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

<form action='[% c.uri_for('/secure/form') | replace('http:', 'https:'%]' method='post'>
Run Code Online (Sandbox Code Playgroud)

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

[% IF c.config.production %]
  <form action='[% c.uri_for('/secure/form') | replace ('http:', 'https:') %]' method='post'>
[% ELSE %]
  <form action='[% c.uri_for('/secure/form') %]' method='post'>
[% END %]
Run Code Online (Sandbox Code Playgroud)

毋庸置疑,这在多个层面上似乎都是错误的.谁有更好的主意?有没有办法强制$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

zak*_*rya 12

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

MyApp->config(using_frontend_proxy => 1);
Run Code Online (Sandbox Code Playgroud)

它在Catalyst的文档中有描述


sin*_*ish 5

以下作品(测试过):

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

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

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