Как перенаправить Определенную страницу 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
, он не будет работать.
Как это реализовать?
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, я добавил его сюда для "потомков", но в этом я согласен с Алексом. В вашем конкретном случае вам следует использовать стандартную страницу контактов и настроить ее шаблон или с дополнительными блоками
На самом деле это не 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 с помощью статических блоков).
Я попробовал решение 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, ваши комментарии приветствуются