Как определить, существует ли URL-адрес в Magento?


Например, у меня есть набор URL-адресов, их переписывание и т. Д.:

test1.html
catalog/product.html
thank-you
catalog/product/view/id/34

Все эти URL-адреса дают 200 ОК при ответе. Моя цель - фильтровать входящие URL-адреса и не разрешать URL-адреса, которые не существуют внутри Magento (я думаю, ответ 404).

Как я могу определить, что этот URL-адрес даст 200 ОК внутри Magento?

Author: Marius, 2013-06-13

2 answers

Я думаю, что самый безопасный способ узнать, даст ли вам URL-адрес 200 или 404 (или любой другой заголовок), - это позвонить по этому URL-адресу. Кроме этого, я не вижу безопасного пути. URL-адреса могут быть допустимыми (catalog/product/view/id/34), но все равно выдавать 404, потому что продукт отключен или не отображается в этом представлении магазина. То же самое касается URL-адресов страниц CMS (test1.html), не говоря уже о том, что test1.html может быть URL-адресом для пользовательской сущности (не страницы CMS).

 2
Author: Marius, 2013-06-13 06:30:11

Вы можете получить все 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 достаточно безопасна, чтобы правильно обрабатывать любые аргументы.

 3
Author: Vinai, 2013-06-13 07:04:59