2013-10-17 29 views
1

我的CakePHP應用程序是在2.4.0如何在cakephp中使用HtmlHelper時將完整的基礎url設置爲cdn?

運行它已經在yourapp.com

我試圖使用Amazon CloudFront的服務靜態資產如CSS,JS和圖像實時運行。

的CDN領域,我選擇了cdn.yourapp.com

可悲的是,當我試圖用這種方式:

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

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

我沒有找回正確的URL我期待着。

我期待

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

但我回來

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

我怎樣才能解決這個問題?

回答

4

兩個解決方案:

簡單地寫的HtmlHelper可以覆蓋默認的圖像,CSS等功能

https://stackoverflow.com/a/9601207/80353的細節

您可以重寫資產Url在你的AppHelper中的功能,以便你不需要重寫所有相關的功能。

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

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

試試這個

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/');  
相關問題