как установить полный базовый URL-адрес в cdn при использовании HtmlHelper в cakephp?

Мое приложение 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/

Я не получил правильный URL, который я ожидал.

я ожидал

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

Но я вернулся

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

Как я могу преодолеть эту проблему?


person Kim Stacks    schedule 17.10.2013    source источник


Ответы (3)


Два решения:

Просто напишите HtmlHelper, который может переопределить стандартные функции изображения, css и т. д.

Подробнее см. https://stackoverflow.com/a/9601207/80353.

or

вы можете переписать функцию assetsUrl в вашем 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;
}

Это пример кода для assetsUrl

реквизиты для @lorenzo на https://github.com/cakephp/cakephp/issues/2149 для этого решения

P.S.: Я переписал это выше как плагин.

Таким образом, вместо этого вы можете просто расширить этот CDNAppHelper с помощью AppHelper.

https://github.com/simkimsia/UtilityHelpers

person Kim Stacks    schedule 17.10.2013

Если вы ищете самые простые вещи, просто обновите несколько параметров в конце вашего файла 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/');    
person Himanshu Singh    schedule 05.11.2014

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

Попробуй это

person krzysiek    schedule 17.10.2013