Как перенаправить Определенную страницу CMS (Контактную форму) на https?


У меня есть контактная форма, которую я показываю со страницы CMS. Как описано в методе: http://inchoo.net/ecommerce/magento/contact-form-in-magento/

URL страницы CMS: customer-service-contact. Я также переопределил стандартный модуль Mage_Contacts. Теперь мне нужно, когда кто-нибудь откроет:

http://{website}/customer-service-contact/

Его следует перенаправить на:

https://{website}/customer-service-contact/

Я знаю о трюке в xml:

<frontend>
    <secure_url>
        <contacts>/contacts/</contacts>
    </secure_url>
</frontend>

Но если я изменю его на url customer-service-contact, он не будет работать.

Как это реализовать?

Author: MTM, 2013-07-09

3 answers

Перенаправление https не работает для страниц cms, потому что Router, соответствующий страницам cms (Mage_Cms_Controller_Router), не проверяет, должна ли какая-либо страница быть защищенной.
Вот небольшой обходной путь для достижения этой цели. Это включает в себя изменение маршрутизатора для страниц cms.
Вам нужно будет создать модуль. Давайте назовем это Easylife_Secure:
Для этого вам понадобятся следующие файлы:
app/etc/modules/Easylife_Secure.xml - файл декларации

<?xml version="1.0"?>
<config>
    <modules>
        <Easylife_Secure>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Core />
                <Mage_Cms /><!-- should depend on Mage_Cms -->
            </depends>
        </Easylife_Secure>
    </modules>
</config>

app/code/local/Easylife/Secure/Controller/Router.php - ваш новый маршрутизатор

<?php
class Easylife_Secure_Controller_Router extends Mage_Cms_Controller_Router
{
    public function match(Zend_Controller_Request_Http $request)
    {
        if (!Mage::isInstalled()) {
            Mage::app()->getFrontController()->getResponse()
                ->setRedirect(Mage::getUrl('install'))
                ->sendResponse();
            exit;
        }

        $identifier = trim($request->getPathInfo(), '/');

        $condition = new Varien_Object(array(
            'identifier' => $identifier,
            'continue'   => true
        ));
        Mage::dispatchEvent('cms_controller_router_match_before', array(
            'router'    => $this,
            'condition' => $condition
        ));
        $identifier = $condition->getIdentifier();

        if ($condition->getRedirectUrl()) {
            Mage::app()->getFrontController()->getResponse()
                ->setRedirect($condition->getRedirectUrl())
                ->sendResponse();
            $request->setDispatched(true);
            return true;
        }

        if (!$condition->getContinue()) {
            return false;
        }

        $page   = Mage::getModel('cms/page');
        $pageId = $page->checkIdentifier($identifier, Mage::app()->getStore()->getId());
        if (!$pageId) {
            return false;
        }
        //this line checks if the page should be secure
        $this->_checkShouldBeSecure($request, '/'.$identifier);
        $request->setModuleName('cms')
            ->setControllerName('page')
            ->setActionName('view')
            ->setParam('page_id', $pageId);
        $request->setAlias(
            Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
            $identifier
        );

        return true;
    }
    protected function _checkShouldBeSecure($request, $path = '')
    {

        if (!Mage::isInstalled() || $request->getPost()) {
            return;
        }

        if ($this->_shouldBeSecure($path) && !$request->isSecure()) {
            $url = $this->_getCurrentSecureUrl($request);
            if ($request->getRouteName() != 'adminhtml' && Mage::app()->getUseSessionInUrl()) {
                $url = Mage::getSingleton('core/url')->getRedirectUrl($url);
            }

            Mage::app()->getFrontController()->getResponse()
                ->setRedirect($url)
                ->sendResponse();
            exit;
        }
    }
    protected function _shouldBeSecure($path)
    {
        return substr(Mage::getStoreConfig('web/unsecure/base_url'), 0, 5) === 'https'
            || Mage::getStoreConfigFlag('web/secure/use_in_frontend')
                && substr(Mage::getStoreConfig('web/secure/base_url'), 0, 5) == 'https'
                && Mage::getConfig()->shouldUrlBeSecure($path);
    }
    protected function _getCurrentSecureUrl($request)
    {
        if ($alias = $request->getAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS)) {
            return Mage::getBaseUrl('link', true).ltrim($alias, '/');
        }

        return Mage::getBaseUrl('link', true).ltrim($request->getPathInfo(), '/');
    }
}

Метод match является так же, как и в маршрутизаторе cms, в нем есть только одна строка, которая проверяет, должен ли путь быть безопасным. Остальные методы скопированы со стандартного маршрутизатора. app/code/local/Easylife/Secure/etc/config.xml - файл конфигурации

<?xml version="1.0"?>
<config>
    <modules>
        <Easylife_Secure>
            <version>0.0.1</version>
        </Easylife_Secure>
    </modules>
    <global>
        <events>
            <controller_front_init_routers>
                <observers>
                    <cms><!-- change the cms router -->
                        <class>Easylife_Secure_Controller_Router</class>
                        <method>initControllerRouters</method>
                    </cms>
                </observers>
            </controller_front_init_routers>
        </events>
    </global>
    <frontend>
        <secure_url><!-- list here your secure pages. one slash (/) and the page identifier -->
            <customer_service_contact>/customer-service-contact</customer_service_contact>
        </secure_url>
    </frontend>
</config>

Очистите кэш, и все готово.
[ РЕДАКТИРОВАТЬ]
Это небольшое расширение работает для общего случая, для всех страниц cms, я добавил его сюда для "потомков", но в этом я согласен с Алексом. В вашем конкретном случае вам следует использовать стандартную страницу контактов и настроить ее шаблон или с дополнительными блоками

 6
Author: Marius, 2013-07-09 12:46:24

На самом деле это не URL-адрес, который сопоставляется с XML-путем frontend/secure_url, а путь действия модуля-контроллера. В вашем случае это было бы /cms/page/view. Если вы вставите /cms/page/view, все страницы CMS будут доставляться по протоколу HTTPs.

Тест выполняется в Mage_Core_Model_Config::shouldUrlBeSecure, который вызывается из Mage_Core_Model_Url::getSecure() следующим образом:

$pathSecure = Mage::getConfig()->shouldUrlBeSecure('/' . $this->getActionPath());

Возможные решения:

  • Напишите модуль, который изменяет эту проверку и добавляет, например, идентификатор страницы или что-то уникальное

  • Настройка контактов страница с помощью других средств (вы можете использовать стандартный /contacts и добавлять переменный контент CMS с помощью статических блоков).

 2
Author: Alex, 2013-07-09 12:16:35

Я попробовал решение Marius и получил цикл перенаправления, так как мой маршрутизатор перенаправляет на HTTPS здесь:

$this->_checkShouldBeSecure($request, '/'.$identifier);

Это запускает новый запрос на https, затем снова вызывается мой новый маршрутизатор, но на этот раз нет необходимости перенаправлять, так как он уже находится в HTTPS, поэтому выполняется этот код:

$request->setModuleName('cms')
    ->setControllerName('page')
    ->setActionName('view')
    ->setParam('page_id', $pageId);

После этого следующий вызываемый маршрутизатор является стандартным маршрутизатором, но на этот раз, поскольку объект $request имеет модуль, контроллер и действие при выполнении этой строки (app/code/local/Mage/Core/Controller/Varien/Router/Standard.php Строка:181):

//checking if this place should be secure
$this->_checkShouldBeSecure($request, '/'.$module.'/'.$controller.'/'.$action);

Из-за этого я перенаправляюсь на HTTP (строка 429):

} elseif (!$this->_shouldBeSecure($path) && $request->isSecure()) {
    // Redirect user from HTTPS to HTTP if the site doesn't need to be secure
    $url = $this->_getCurrentUnsecureUrl($request);

    Mage::app()->getFrontController()->getResponse()
        ->setRedirect($url, 301)
        ->sendResponse();
    exit;

А затем все начинается сначала, и это цикл перенаправления.

То, что я сделал, чтобы решить эту проблему, нехорошо:(и я надеюсь, что кто-нибудь сможет предложить лучшее решение. Я добавил этот метод в свой новый маршрутизатор:

protected function preventSecureToNonSecureRedirect($cmsPageIdentifier)
{
    if (Mage::getConfig()->shouldUrlBeSecure($cmsPageIdentifier)) {
        Mage::getConfig()->setNode('frontend/secure_url/cms_page', '/cms/page/view', true);
    }
}

А затем я вызываю этот метод в своем новом маршрутизаторе непосредственно перед возвращением true в методе соответствия:

$request->setModuleName('cms')
    ->setControllerName('page')
    ->setActionName('view')
    ->setParam('page_id', $pageId);
$request->setAlias(
    Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
    $identifier
);

$this->preventSecureToNonSecureRedirect('/'.$identifier);
return true;

По то, как я использую magento 1.9.1.0, ваши комментарии приветствуются

 1
Author: lloiacono, 2016-03-01 15:48:03