在AWS Cloudfront上设置Cakephp应用程序的路由和弹性负载平衡(使用beanstalk)

时间:2013-12-01 06:48:35

标签: cakephp amazon-web-services amazon-cloudfront elastic-beanstalk amazon-route53

我想请求您帮助如何在AWS上为 Cakephp Web应用程序正确设置路由。我使用PHP配置在AWS Elastic Beanstalk上运行Cakephp,然后为我的域设置了一条A记录(例如foo.com),链接到与Beanstalk的默认ELB链接的Cloudfront CDN。一切正常,直到我发现Cakephp处理的所有重定向都将重定向到ELB的默认公共DNS(elb-abc123.elb.amazonaws.com/page/)而不是foo.com/page/。我知道elb有一个名为CName的东西,但我无法让它工作(http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/using-domain-names-with-elb.html?)。而且我不确定这是否与.htaccess有关。

以下是我的域名的路线53设置:

foo.com. A ALIAS examplecode.cloudfront.net (examplecode...)
www.foo.com. A ALIAS examplecode.cloudfront.net (examplecode...)

和CanFront设置:

Alternative Domain Names (CName): foo.com, www.foo.com

好的,这是我面临的一个例子:
架构:客户端 - > cloudfront-> elb(beanstalk) - > EC2
1.当客户在他/她的浏览器中输入foo.comwww.foo.com时,一切正常。
2.当客户端尝试请求安全页面foo.com/account/index(例如帐户页面)时,Cakephp会要求登录,因此重定向由cakephp控制器处理:$this->redirect(array('controller' => 'secure', 'action' => 'login'));
3.期待的登陆网址应为foo.com/secure/login/,结果为elb-abc123.elb.amazonaws.com/secure/login

有人可以帮助我,谢谢。

1 个答案:

答案 0 :(得分:1)

检查env('HTTP_HOST')的返回值,这是CakePHP默认使用的基本URL。它可能会返回elb-abc123.elb.amazonaws.com

如果您无法更改该行为,则根据您的CakePHP版本,使用FULL_BASE_URLApp.fullBaseUrlRouter::fullBaseURL()自行定义正确的基本网址。

$s = null;
if (env('HTTPS')) {
    $s = 's';
}
$fullBaseUrl = 'http' . $s . '://foo.com';

index.php

define('FULL_BASE_URL', $fullBaseUrl);
Configure::write('App.fullBaseUrl', FULL_BASE_URL);

或者在任何时候(假设Router班级可用):

Router::fullBaseUrl($fullBaseUrl);