我使用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服务器将环境变量设置HTTPS为ON
zak*_*rya 12
您可以尝试以下配置选项:
MyApp->config(using_frontend_proxy => 1);
Run Code Online (Sandbox Code Playgroud)
它在Catalyst的文档中有描述
以下作品(测试过):
在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')
| 归档时间: |
|
| 查看次数: |
2919 次 |
| 最近记录: |