1

我的 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

我该如何克服这个问题?

4

3 回答 3

4

两种解决方案:

简单写一个HtmlHelper,可以覆盖默认图片、css等功能

有关详细信息,请参阅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提供此解决方案的道具

PS:我已将以上内容重写为插件。

因此,您可以简单地让 AppHelper 扩展此 CDNAAppHelper。

https://github.com/simkimsia/UtilityHelpers

于 2013-10-17T09:54:55.597 回答
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/');    
于 2014-11-05T13:25:47.023 回答
2
echo $this->Html->css('alpha_landing/styles', array(
'fullBase' => true,
'pathPrefix'=>$cdnBaseUrl.'css/'));

试试这个

于 2013-10-17T08:48:00.653 回答