Использование безопасных URL-адресов на основе контекста
Я знаком с использованием различных методов для создания безопасного URL-адреса на основе контекста, т.Е.:
$this->getUrl('my-page', array('_forced_secure' => $this->getRequest()->isSecure()));
Это отлично подходит для создания ссылок, которые будут направлять на защищенную страницу , пока вы находитесь в безопасном режиме (или просто будут ссылаться на незащищенную страницу, если не используете безопасный режим).
Проблема, на которую я смотрю, заключается в том, что Magento рассматривает только несколько специальных страниц, которые должны быть безопасными (учетная запись клиента, оформление заказа и т. Д.). То, что я бы предпочел, было бы иметь Magento всегда использует защищенную ссылку , если пользователь в данный момент находится в безопасном режиме , или используйте незащищенную ссылку, если пользователь находится в незащищенном режиме.
Из того, что я могу сказать, мои единственные реальные варианты:
- Измените каждый экземпляр
$this->getUrl()
, чтобы он был похож на приведенный выше фрагмент. - Установите небезопасный
base_url
для использования HTTPS, принудительно защищая все страницы.
Есть ли лучший метод, который не потребует изменения каждого вызова на $this->getUrl()
или принудительного перевода всех страниц на HTTPS независимо от контекста пользователя?
--редактировать --
Я знаю, что могу изменить метод /app/code/core/Mage/Core/Model/Url.php->setRouteParams()
, хотя я надеюсь, что есть более чистый способ.
3 answers
Если Magento всегда будет соответствовать протоколу, по которому в данный момент работает пользователь, это вызовет проблемы, такие как не выплевывание безопасных URL-адресов на страницу входа клиента при использовании незащищенного URL-адреса, такого как домашняя страница сайта.
Что я бы предложил сделать, так это добавить некоторый конфигурационный XML в конфигурационный файл пользовательского модуля, чтобы объявить дополнительные маршруты, которые вам нужны, безопасными как безопасные. Вы делаете это, имея это в своем config.xml файл (замена module_or_route_id
чем-то уникальный:
<config>
<frontend>
<secure_url>
<module_or_route_id>/route/</module_or_route_id>
</secure_url>
</frontend>
</config>
Если вы взглянете на config.xml для модуля Mage_Customer вы увидите пример этого, где путь "/customer/" был определен как безопасный.
Примечание: если часть module_or_route_id
приведенного выше примера не уникальна, будет использоваться только одно определение, что приведет к тому, что что-то не будет должным образом защищено. Убедитесь, что имя узла уникально.:)
Поскольку это основано на пути, я не уверен, как это будет напрямую применяться к URL-адресам отдельных Например, страницы содержимого CMS, поскольку все они по-прежнему будут иметь общий маршрут/путь, поскольку это перезапись, которая отправляет их все на один и тот же контроллер CMS.
Если вам действительно нужно, чтобы весь сайт работал по протоколу HTTPS, вам придется использовать URL-адреса https:// как для безопасных, так и для небезопасных базовых URL-адресов.
Задайте следующее в своем файле app/etc/config.xml
:
<?xml version="1.0"?>
<config>
<frontend>
<secure_url>
<all>/</all>
</secure_url>
</frontend>
</config>
Это работает в Magento 1.9.1
Если пользователь использует https, это должно заставить все URL-адреса переписываться на https.
В System|Configuration|Web есть заниженная, но важная опция ~, где вы должны сказать "использовать безопасный URL-адрес в интерфейсе" - если вы установите для этого значение "да", то страница, загруженная по протоколу https, будет использовать ссылки https,
В большинстве случаев нет необходимости писать код или предоставлять дополнительную конфигурацию