如何在cakephp中使用HtmlHelper时将完整的基本URL设置为cdn?

时间:2013-10-17 08:11:47

标签: cakephp cakephp-2.0 cdn cakephp-2.3

我的cakephp应用程序在2.4.0上运行

它已在yourapp.com上正常运行

我正在尝试使用Amazon CloudFront来提供静态资产,如css,js和图像。

我选择的CDN域名为cdn.yourapp.com

可悲的是,当我试图以这种方式使用它时:

echo $this->Html->css('alpha_landing/styles', array('fullBase' => $cdnBaseUrl));

其中$cdnBaseUrlhttp://cdn.yourapp.com/

我没有找到我期待的正确网址。

我在期待

http://cdn.yourapp.com/css/some.css

但我回来了

http://yourapp.com/css/some.css

我该如何克服这个问题?

3 个答案:

答案 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。

https://github.com/simkimsia/UtilityHelpers

答案 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/'));

试试这个