CakePHP: Расширенная маршрутизация «SEO» - Как сохранить старые URL-адреса Маршруты для измененных сообщений, для 301 переадресации внешних ссылок - PullRequest
1 голос
/ 15 августа 2011

У меня проблема с маршрутизацией нового проекта.

Для большинства действий и сущностей, таких как пользователи, URL-адреса никогда не меняются, поскольку имена пользователей, т. Е. Уникальны и не могут быть изменены. Для этого мы можем легко использовать такие маршруты:

Router::connect('/a/:username/topic/:id', array('controller' => 'users', 'action' => 'view'),array('pass' => array('username','id'),'username' => '[^-]+','id' => '[0-9]+'));
Router::connect('/a/:username', array('controller' => 'users', 'action' => 'view'),array('pass' => array('username'),'username' => '[^-]+'));

Но для постов (и некоторых других объектов) заголовки могут / будут меняться из-за опечаток или чего-то еще. Представьте, что вы меняете название поста (или что-то еще) 5 раз. Каждый раз было построено несколько внешних ссылок. Поэтому мы хотим убедиться, что каждая внешняя ссылка по-прежнему работает и перенаправляет на текущий URL-ключ с правильным / измененным заголовком со статусом 301.

Из-за этого мы попытались реализовать таблицу для маршрутов со следующими полями:

id, source, ref_id, target_controller, target_action, target_param, parent_id

Каждый раз, когда загружается rout.php, цикл foreach будет проходить по таблице и соединяться с каждым маршрутом, у которого НЕТ родителя. Отсутствие родителя означает, что запись является текущим (самым последним) ключом URL для конкретной сущности.

Если запрос идет на «старый» URL-ключ, мы автоматически перенаправляем на родительский (самый последний ключ) с 301.

Это работает довольно хорошо, но ....:

Позже, когда эта таблица содержит тысячи записей, приложение будет читать все эти записи (если только кэш не обновлен) и будет «маршрутизировать :: соединять» тысячи маршрутов вместо 5-10 очень общих маршрутов, подобных тем, которые видели выше. И это каждый раз, когда наш «кэш маршрутов» устарел (что может быть очень часто).

Я спрашиваю себя, нет ли другого решения, позволяющего поддерживать все старые маршруты в рабочем состоянии, не съедая много производительности.

Буду рад любой обратной связи. Большое спасибо!

1 Ответ

0 голосов
/ 15 августа 2011

Вместо того, чтобы генерировать тысячи маршрутов во время выполнения и кэшировать их, рассматривали ли вы с использованием пользовательского класса маршрутов , который просто определяет маршрут для текущего запроса?

В прошлом маршруты слагов были немного хитрыми, так как обеспечение того, что у вас был действительный слаг, нужно было либо выполнить на уровне контроллера / модели, либо вам нужно было подключить несколько сотен маршрутов, по одному для каждого слагаемого статьи.Обе реализации оставляют желать лучшего....

...