【问题标题】:Setting up routing for Cakephp application on AWS cloudfront and elastic load balance (using beanstalk)在 AWS cloudfront 上为 Cakephp 应用程序设置路由和弹性负载平衡(使用 beanstalk)
【发布时间】:2013-12-17 01:17:21
【问题描述】:

我想请教您如何为 AWS 上的 Cakephp Web 应用程序正确设置路由。我让 Cakephp 在 AWS Elastic Beanstalk 上运行,使用 PHP 配置,然后我为我的域(例如 foo.com)设置了一条 A 记录,该记录链接到 Cloudfront CDN,该 CDN 链接到 Beanstalk 的默认 ELB。一切正常,直到我发现 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...)

以及 CandFront 设置:

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. 预期的登陆 url 应该是foo.com/secure/login/ bur 结果是elb-abc123.elb.amazonaws.com/secure/login

谁能帮帮我,谢谢。

【问题讨论】:

  • 很多信息,但请务必提及您的确切 CakePHP 版本!
  • 嗨,ndm:我使用的是 Cakephp 2.4.3(最新的)。感谢您的解决方案,我需要 2~3 天来更新应用程序。

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


【解决方案1】:

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

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

$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);

【讨论】:

  • 嗨,ndm:我想说谢谢,这行得通。但是,我终于明白了什么是 CDN,例如cloudfront,用于:它是一种内容交付服务,用于交付“静态对象”(图像.. css 文件等),而不是动态内容。因此 AWS cloudfront 不能将整个网站交付给最终用户,而是向他们交付部分内容以加快页面加载速度。因此,我将所有图像更改为链接到 S3 存储桶的foo.cloudfront.net/foo。所以不需要将fullBaseUrl设置为'foo.com',只需要DNS中的cname即可!谢谢!
猜你喜欢
  • 2017-09-21
  • 2020-11-06
  • 2018-01-30
  • 1970-01-01
  • 2014-02-04
  • 2013-03-22
  • 2020-10-09
  • 2023-04-10
  • 2019-12-22
相关资源
最近更新 更多