Создание канонических URL с помощью пользовательских классов маршрутов - PullRequest
0 голосов
/ 02 сентября 2011

Я пытаюсь реализовать канонические URL-адреса и объединить их с пользовательскими классами маршрутов.

Схема URL выглядит примерно так:

/category-x/article/123
/category-y/article/123

Я создаю собственный маршрут-class, расширяющий Zend_Controller_Router_Route_Regex, и проверяет, что статья 123 существует и что URL содержит правильное имя категории.Если статья 123 относится к категории-x, а пользователь обращается к категории-y, я хочу перенаправить на правильный URL-адрес.

Но маршруты не имеют очевидной возможности сделать это напрямую.Каков наилучший практический подход здесь?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2011

Я получил следующее решение:

  1. Пользовательский маршрутный класс создает канонический URL-адрес в своем методе match () - вот так:

    public function match($path, $partial = false) {
        $match = parent::match($path, $partial);
    
        if (!empty($match)) {
             $article = $this->backend->getArticle($match['articleId']);
    
             if (!$article) {
                 throw new Zend_Controller_Router_Exception('Article does not exist', 404);
             }
    
             $match['canonicalUrl'] = $this->assemble(array(
                 'title' => $article->getTitle(), 
                 'articleId' => $article->getId()
            ));
        }
    
        return $match;
    }
    

    $ article заполняется внутри match (), если parent :: match () возвращает массив.

  2. Я создал плагин фронт-контроллера, который перехватывает routeShutdown () следующим образом:

    public function routeShutdown(Zend_Controller_Request_Abstract $request) {
        if ($request->has('canonicalUrl')){
            $canonicalUrl = $request->getBaseUrl() . '/' . $request->get('canonicalUrl');
    
            if ($canonicalUrl != $request->getRequestUri()) {
                $this->getResponse()->setRedirect($canonicalUrl, 301);
            }
        }
    }
    

    Он просто проверяет, создал ли маршрут (custom или native Zend) канонический URL-адрес и, если запрошенный URL-адрес не совпадает, перенаправьте на правильный канонический URL-адрес.

0 голосов
/ 02 сентября 2011

Я часто делаю это в своем контроллере действий.Примерно так ...

// assuming GET /category-y/article/123
// $article->url is generated, and contains /category-x/article/123

if (this->_request->getRequestUri() != $article->url) {
    return $this->_helper->redirector->goToUrl($article->url);
}

В этом примере $ article-> url необходимо будет сгенерировать из данных вашей базы данных.Я часто использую это для проверки правильности slug, когда я также извлекаю идентификатор объекта.

Вы также можете переместить это в свой класс маршрутизации, если вы хотите использовать пользовательский вместо Regex (выможет подкласс это).

...