Как определить, существует ли URL-адрес в Magento?
Например, у меня есть набор URL-адресов, их переписывание и т. Д.:
test1.html
catalog/product.html
thank-you
catalog/product/view/id/34
Все эти URL-адреса дают 200 ОК при ответе. Моя цель - фильтровать входящие URL-адреса и не разрешать URL-адреса, которые не существуют внутри Magento (я думаю, ответ 404).
Как я могу определить, что этот URL-адрес даст 200 ОК внутри Magento?
2 answers
Я думаю, что самый безопасный способ узнать, даст ли вам URL-адрес 200 или 404 (или любой другой заголовок), - это позвонить по этому URL-адресу. Кроме этого, я не вижу безопасного пути. URL-адреса могут быть допустимыми (catalog/product/view/id/34
), но все равно выдавать 404, потому что продукт отключен или не отображается в этом представлении магазина. То же самое касается URL-адресов страниц CMS (test1.html
), не говоря уже о том, что test1.html
может быть URL-адресом для пользовательской сущности (не страницы CMS).
Вы можете получить все URL-адреса страниц продуктов и категорий из встроенной карты сайта (см. Mage_Sitemap_Model_Sitemap::generateXml()
.
Для страниц CMS вам нужно будет получить список URL-адресов через коллекцию страниц CMS
$pages = Mage::getResourceModel('cms/page_collection')->getColumnValues('identifier');
Это охватывает все URL-адреса "SEF" в Magento, что оставляет нам обычный URL-адрес типа действия контроллера маршрута.
Собрать список маршрутов легко: Mage::getConfig()->getNode()->xpath('./*/routers')
, но на самом деле гораздо сложнее выяснить, какие контроллеры с действительными действиями.
Я предлагаю вам использовать существующую логику маршрутизатора standard
и admin
для построения списка классов контроллеров и проверки каждого из них на наличие допустимых действий.
Для загрузки маршрутизаторов вы можете использовать передний контроллер: Mage::app()->getFrontController()->init()
;
Затем обратитесь к Mage_Core_Controller_Varien_Router_Standard::match()
для получения более подробной информации, то есть как он проверяет и создает экземпляры контроллеров и проверяет, присутствует ли действие.
Возможно, вам захочется расширить маршрутизатор, чтобы иметь доступ к защищенному списку маршрутов в вашем пользовательском логика.
Что касается части пути запроса за route/controller/action
, например, каталог/продукт/представление /идентификатор/44, я не думаю, что возможно добавить белый список для них.
Если маршрут верен, я надеюсь, что логика Magento достаточно безопасна, чтобы правильно обрабатывать любые аргументы.