Month: September 2010

  • Magento extension: rcah 0.2.0 is released

    In previous version of rcah module, if “Use Canonical Link Meta Tag For Categories” is enabled in System >> Configuration >> Catalog >> Search Engine Optimizations,

    and if you set a root category as homepage, the homepage html head outputs a link like

    <link rel=”canonical” href=”http://MY_DOMAIN/catalog/category/view/s/URL_KEY/id/ROOT_CATEGORY_ID/” />

    or if you set a subcategory as homepage (System -> Configuration -> General -> Web -> Default Pages -> Default web URL set to “rcah/index/index/id/SUBCATEGORY_ID”), the homepage html head outputs a link like

    <link rel=”canonical” href=”http://MY_DOMAIN/REWRITED_URL” />

    In the first scenario, the canonical link is invalid because Magento native code won’t allow root category page be accessed. In the second scenario, the canonical link is valid, but it should be “http://MY_DOMAIN/” in either scenario.

    Release 0.2.0 is to fix this problem. Download RootCategoryAsHomepage.tar.gz

    Just for your interest, I was going to write IndexController like this to fix the problem.

    /**
    * most code is from CategoryController::viewAction()
    *
    * run _modifyCanonial() before render layout
    */
    public function indexAction()
    {
    if ($category = $this->_initCatagory()) {
    
    Mage::getModel('catalog/design')->applyDesign($category, Mage_Catalog_Model_Design::APPLY_FOR_CATEGORY);
    Mage::getSingleton('catalog/session')->setLastViewedCategoryId($category->getId());
    
    $update = $this->getLayout()->getUpdate();
    $update->addHandle('default');
    
    if (!$category->hasChildren()) {
    $update->addHandle('catalog_category_layered_nochildren');
    }
    
    $this->addActionLayoutHandles();
    
    $update->addHandle($category->getLayoutUpdateHandle());
    $update->addHandle('CATEGORY_'.$category->getId());
    
    
    
    if ($category->getPageLayout()) {
    $this->getLayout()->helper('page/layout')
    ->applyHandle($category->getPageLayout());
    }
    
    $this->loadLayoutUpdates();
    
    $update->addUpdate($category->getCustomLayoutUpdate());
    
    $this->generateLayoutXml()->generateLayoutBlocks();
    
    if ($category->getPageLayout()) {
    $this->getLayout()->helper('page/layout')
    ->applyTemplate($category->getPageLayout());
    }
    
    if ($root = $this->getLayout()->getBlock('root')) {
    $root->addBodyClass('categorypath-'.$category->getUrlPath())
    ->addBodyClass('category-'.$category->getUrlKey());
    }
    
    $this->_initLayoutMessages('catalog/session');
    $this->_initLayoutMessages('checkout/session');
    $this->_modifyCanonial()->renderLayout();
    }
    elseif (!$this->getResponse()->isRedirect()) {
    $this->_forward('noRoute');
    }
    }
    
    /***
    * Find link_rel item in items of head, and modify it
    *
    * Each item is array of 5 in a format like
    * array('type'=>'link_rel',
    *         'name'=>'http://domain/path',
    *         'params'=>'rel="canonical"',
    *         'if'=>null,
    *         'cond'=>null);
    */
    protected function _modifyCanonial() {
    if ($headBlock = $this->getLayout()->getBlock('head')) {
    $items = $headBlock->getData('items');
    foreach ($items as $key => $value) {
    if (false !== strpos($key, 'link_rel')) {
    if ($value['type'] == 'link_rel' && $value['params'] == 'rel="canonical"') {
    $value['name'] = Mage::getUrl();
    $items[$key] = $value;
    $headBlock->setData('items', $items);
    break;
    }
    
    }
    }
    }
    return $this;
    }
    

    However, just before release, I found a much better way: just use setCategoryUrl in _initCatagory(). So now IndexController is now as:

    protected function _initCatagory()
    {
    Mage::dispatchEvent('catalog_controller_category_init_before', array('controller_action'=>$this));
    $rootCategoryId = Mage::app()->getStore()->getRootCategoryId();
    $categoryId = (int) $this->getRequest()->getParam('id', $rootCategoryId);
    if (!$categoryId) {
    return false;
    }
    
    $category = Mage::getModel('catalog/category')
    ->setStoreId(Mage::app()->getStore()->getId())
    ->load($categoryId)
    //force url as a homepage url to work with canonical link
    ->setUrl(Mage::getUrl());
    
    if ($categoryId == $rootCategoryId) {
    //do nothing. bypass canshow test for root category
    }
    elseif (!Mage::helper('catalog/category')->canShow($category)) {
    return false;
    }
    Mage::getSingleton('catalog/session')->setLastVisitedCategoryId($category->getId());
    Mage::register('current_category', $category);
    try {
    Mage::dispatchEvent('catalog_controller_category_init_after', array('category'=>$category, 'controller_action'=>$this));
    } catch (Mage_Core_Exception $e) {
    Mage::logException($e);
    return false;
    }
    return $category;
    }
    
    public function indexAction() {
    parent::viewAction();
    }
    
  • Install SSL certificate on Nginx step by step

    Although I have installed SSL certificates for several times, every time I google step by step guide. So now I take my own note:

    Step 1: Generate key

    $ openssl genrsa -des3 -out verisign-mydomain.co.uk.key 1024
    Generating RSA private key, 1024 bit long modulus
    ………………….++++++
    …………………++++++
    e is 65537 (0x10001)
    Enter pass phrase for verisign-mydomain.co.uk.key:
    Verifying – Enter pass phrase for verisign-mydomain.co.uk.key:

    Step 2:  Remove pass phrase from key (otherwise Nginx asks for pass phrase every time it starts)

    $ openssl rsa -in verisign-mydomain.co.uk.key -out verisign-mydomain.co.uk.no-passphrase.key
    Enter pass phrase for verisign-mydomain.co.uk.key:
    writing RSA key

    Step 3: Generate CSR

    $ openssl req -new -key verisign-mydomain.co.uk.no-passphrase.key -out verisign-mydomain.co.uk.csr
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter ‘.’, the field will be left blank.
    —–
    Country Name (2 letter code) [GB]:
    State or Province Name (full name) [Berkshire]:E Sussex
    Locality Name (eg, city) [Newbury]:Brighton
    Organization Name (eg, company) [My Company Ltd]:Euro Ltd
    Organizational Unit Name (eg, section) []:
    Common Name (eg, your name or your server’s hostname) []:mydomain.co.uk
    Email Address []:

    Please enter the following ‘extra’ attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:

    Step 4: Send CSR to authority and get CRT

    Step 5: Download CA intermediate certificate from authroity

    Step 6: Concatenate CA intermediate certificate with CRT (CRT on top)

    $ cat ca.crt >> my.crt

    Step 7: Make necessary changes to Nginx configuration

    Nginx only need two file: my.crt (concatenated) and verisign-mydomain.co.uk.no-passphrase.key