我的cakephp应用程序在2.4.0上运行
它已在yourapp.com上正常运行
我正在尝试使用Amazon CloudFront来提供静态资产,如css,js和图像。
我选择的CDN域名为cdn.yourapp.com
可悲的是,当我试图以这种方式使用它时:
echo $this->Html->css('alpha_landing/styles', array('fullBase' => $cdnBaseUrl));
其中$cdnBaseUrl
为http://cdn.yourapp.com/
我没有找到我期待的正确网址。
我在期待
http://cdn.yourapp.com/css/some.css
但我回来了
http://yourapp.com/css/some.css
我该如何克服这个问题?
答案 0 :(得分:4)
两种解决方案:
只需编写一个可以覆盖默认图像,css等功能的HtmlHelper
有关详细信息,请参阅https://stackoverflow.com/a/9601207/80353
或
您可以在AppHelper中重写assetUrl函数,这样就不需要重写所有相关函数。
public function assetUrl($path, $options = array()) {
$cdnBaseUrl = Configure::read('App.assetsUrl');
$legitCDN = (strpos($cdnBaseUrl, '://') !== false);
if (is_array($path)) {
$path = $this->url($path, !empty($options['fullBase']));
if ($legitCDN) {
return rtrim($cdnBaseUrl, '/') . '/' . ltrim($path, '/');
}
return $path;
}
if (strpos($path, '://') !== false) {
return $path;
}
if (!array_key_exists('plugin', $options) || $options['plugin'] !== false) {
list($plugin, $path) = $this->_View->pluginSplit($path, false);
}
if (!empty($options['pathPrefix']) && $path[0] !== '/') {
$path = $options['pathPrefix'] . $path;
}
if (
!empty($options['ext']) &&
strpos($path, '?') === false &&
substr($path, -strlen($options['ext'])) !== $options['ext']
) {
$path .= $options['ext'];
}
if (isset($plugin)) {
$path = Inflector::underscore($plugin) . '/' . $path;
}
$path = $this->_encodeUrl($this->assetTimestamp($this->webroot($path)));
if ($legitCDN) {
$path = rtrim($cdnBaseUrl, '/') . '/' . ltrim($path, '/');
}
return $path;
}
这是assetUrl的示例代码
在https://github.com/cakephp/cakephp/issues/2149处为@lorenzo提供此解决方案的道具
P.S。:我已将上述内容重写为插件。
所以你可以简单地让AppHelper扩展这个CDNAppHelper。
答案 1 :(得分:4)
如果您正在寻找最简单的东西,只需在core.php文件末尾更新几个参数
Configure::write('App.imageBaseUrl', 'http://cdn.yourdomain.com/img/');
Configure::write('App.cssBaseUrl', 'http://cdn.yourdomain.com/css/');
Configure::write('App.jsBaseUrl', 'http://cdn.yourdomain.com/js/');
答案 2 :(得分:2)
echo $this->Html->css('alpha_landing/styles', array(
'fullBase' => true,
'pathPrefix'=>$cdnBaseUrl.'css/'));
试试这个