經過對Magento的瞭解,發現Magento的資源文件主要分佈在media、js、skin三個文件夾裏,media文件夾主要包括了系統自帶編輯器WYSIWYG Editor 全部編輯器涉及到的資源(Static Blocks、Pages、Product Intro、Product Images)以及Magento自主生成的媒體資源 (包含了咱們容許用戶上傳文件的文件夾);skin文件夾主要是模板提供的樣式、圖片、js資源(通常咱們對模板再次改造時會改到這個文件夾裏的資源);js文件夾包括Magento官方的prototype、varien、scriptaculous、mage等js庫以及附屬資源(通常咱們不會去動這個文件夾),這三個文件夾所包含的所有都是靜態資源(圖片、js、css、字體、文檔等) 也就是咱們能夠CDN的文件php
經過對Magento源碼的觀察,網站公開方法getBaseUrl AT app/core/Mage/Core/Model/Store.phpcss
public function getBaseUrl($type = self::URL_TYPE_LINK, $secure = null) { $cacheKey = $type . '/' . (is_null($secure) ? 'null' : ($secure ? 'true' : 'false')); if (!isset($this->_baseUrlCache[$cacheKey])) { switch ($type) { case self::URL_TYPE_WEB: $secure = is_null($secure) ? $this->isCurrentlySecure() : (bool)$secure; $url = $this->getConfig('web/' . ($secure ? 'secure' : 'unsecure') . '/base_url'); break; case self::URL_TYPE_LINK: $secure = (bool) $secure; $url = $this->getConfig('web/' . ($secure ? 'secure' : 'unsecure') . '/base_link_url'); $url = $this->_updatePathUseRewrites($url); $url = $this->_updatePathUseStoreView($url); break; case self::URL_TYPE_DIRECT_LINK: $secure = (bool) $secure; $url = $this->getConfig('web/' . ($secure ? 'secure' : 'unsecure') . '/base_link_url'); $url = $this->_updatePathUseRewrites($url); break; case self::URL_TYPE_SKIN: case self::URL_TYPE_JS: $secure = is_null($secure) ? $this->isCurrentlySecure() : (bool) $secure; $url = $this->getConfig('web/' . ($secure ? 'secure' : 'unsecure') . '/base_' . $type . '_url'); break; case self::URL_TYPE_MEDIA: $url = $this->_updateMediaPathUseRewrites($secure); break; default: throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid base url type')); } if (false !== strpos($url, '{{base_url}}')) { $baseUrl = Mage::getConfig()->substDistroServerVars('{{base_url}}'); $url = str_replace('{{base_url}}', $baseUrl, $url); } $this->_baseUrlCache[$cacheKey] = rtrim($url, '/') . '/'; } return $this->_baseUrlCache[$cacheKey]; }
URL_TYPE_MEDIA的獲取方式更復雜些 咱們也看看寫了什麼nginx
protected function _updateMediaPathUseRewrites($secure = null, $type = self::URL_TYPE_MEDIA) { $secure = is_null($secure) ? $this->isCurrentlySecure() : (bool) $secure; $secureStringFlag = $secure ? 'secure' : 'unsecure'; $url = $this->getConfig('web/' . $secureStringFlag . '/base_' . $type . '_url'); if (!$this->getConfig(self::XML_PATH_USE_REWRITES) && Mage::helper('core/file_storage_database')->checkDbUsage() ) { $urlStart = $this->getConfig('web/' . $secureStringFlag . '/base_url'); $url = str_replace($urlStart, $urlStart . self::MEDIA_REWRITE_SCRIPT, $url); } return $url; }
咱們能夠發現全部$type 類型的 始終會從 getConfig(string configPath) 中得到,所得到保存數據庫 在後臺 configuration -> general Web -> Unsecure & Secure 裏能夠配置修改。web
假設把Magento整站當作CDN源服務器,再把BASE_MEDIA_URL、BASE_SKIN_URL、BASE_JS_URL的值改爲CDN的地址,是否是就對Magento的資源進行了CDN處理了呢,因而我就先把本地的機器裝上了Magento來測試一番(俗話說實踐是檢驗真理的惟一方法),因爲CDN須要域名解析,咱們暫時不理會也不去搞CDN,可是咱們能夠用重定向一個新域名來表明這個CDN,好比 hosts里加兩個域名用來測試數據庫
127.0.0.1 magento.yourdomain.com 127.0.0.1 mage-cdn.yourdomain.com
Nginx裏把原來magento.yourdomain.com的配置複製一份並刪除php解析那一段保證安全。順便在資源那加入儘量多的資源類型(之後不夠還能夠再加)跨域
重啓nginx,而後登錄Magento後臺 把 BASE_MEDIA_URL、BASE_SKIN_URL、BASE_JS_URL 中原來的 {{base_unsecure_url}} 都改爲 http://mage-cdn.yourdomain.com/ 、{{base_secure_url}} 都改爲 https://mage-cdn.yourdomain.com/ 而後保存設置 從新刷下Magento緩存 OK 大功告成。緩存
打開http://magento.yourdomain.com/ 試試,誒 假設你用了別的模板,裏面加了不少字體,你可能會看到有跨域訪問的錯誤提示:安全
Font from origin 'https://mage-cdn.yourdomain.com' has been blocked from loading by Cross-Origin Resource Sharing policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://magento.yourdomain.com' is therefore not allowed access.
他告訴你magento的站點想訪問mage-cdn的一些資源可是因爲沒有Access-Control-Allow-Origin 頭,因此咱們在nginx配置mage-cdn站點裏資源文件訪問時統一加上 add_header Access-Control-Allow-Origin https://magento.yourdomain.com. 爲何不用*呢,假如你很大方的想別的網站也能跨域訪問你的資源那你就使用*吧,我是建議那裏用的綁哪裏,呵呵服務器
而後咱們在打開Magento站點 進行各類測試 註冊 登錄 下單 上傳 後臺各類編輯 OK 此次咱們真的大功告成了。app
加下來就是部署CDN了,登錄CDN服務商,直接將源站點設置爲你的 magento.yourdomain.com 通常CDN都提供CNAME服務,那麼你大方的解析一個cdn.yourdomain.com CNAME給 CDN服務商提供給你的地址 abcd.xxxx.com ,通常CDN服務商也一樣提供headers 的添加 你能夠爲這個CDN添加須要headers,就是咱們須要的跨域請求。再就是配置Magento 而後blablabla 最後你想辦法讓CDN服務商用你的crt證書。OK 這下能夠搞定了