2012-02-10 2 views
1

Все,CakePHP: Проблемы с маршрутизации

В настоящее время я использую CakePHP, чтобы полностью обновить текущий текущий сайт НОВОСТИ. Я переношу все текущие статьи на новый сайт, и они будут использовать тот же article_id, что и текущий сайт. Однако я осознал следующую проблему.

Мой текущий сайт использует следующие настройки в качестве URL:

http://www.mydomain.com/?c=140&a=4388 

c= ссылается на идентификатор категории и a= ссылки статья ID. Моя новая настройка (CakePHP) я воспользоваться слизнями и теперь моих статей URL-адрес отображается как:

http://www.mydomain.com/noticia/this-is-an-article-slug 

Так, я заметил, через WebStats, что многие из моих статей доступны через установку ссылки на других сайтах, как Facebook , Я подумал, что было бы крайне важно создать систему/маршрут, который позаботится об этом для меня.

Это то, что я имею в виду:

  1. Создание маршрута, который определяет запросы, похожие на то, что упомянуто выше
  2. Сделать маршрут передать значение a в качестве параметра функции перенаправления в мой контроллер статей, такие как articleRedirect($article_id)
  3. Эта функция будет выглядеть в базе данных для slug на основе переданного $article_id и перенаправить на новый адрес (см функцию ниже)

    // Function in articles controller to redirect old site's article url to 
    // new websites url format 
    
    function articleRedirect($article_id = NULL){ 
        $this->Article->recursive = -1; 
        $slug = $this->Article->findById($article_id);   
        if($slug == NULL){ 
         $this->Session->setFlash('Article not found'); 
         $this->redirect('/noticias'); 
        }else{ 
         $this->redirect('/noticia/'.$slug['Article']['slug']); 
        } 
    } 
    

Я думаю, что это должно сработать. Однако мне нужна серьезная помощь в маршрутизации. Может кто-нибудь предложить маршрут, который я могу использовать.

спасибо.

ответ

0

Спасибо за Oldskool за готовность помочь. Однако мне не удалось его реализовать. Я решил держаться подальше от использования.Htaccess или маршруты и решили реализовать функцию в app_controller, который будет обрабатывать это для меня, как, например:

В моей app_controller'sbeforeFilter() я добавил следующее:

//Check old url style as in http://www.bravanews.com/?c=123&a=2345 for redirection 
    //to the correct new url style as in http://www.bravanews.com/noticia/news-title-using-slug 
    $this->CheckOldUrl(); 

Тогда в моем app_controller.php я создал следующую функцию:

function CheckOldUrl(){ 
    preg_match("/\?c=(\w+)\&a=(\w+)/i", $_SERVER['REQUEST_URI'], $matches); 
    if(!$matches == NULL){ 
     $this->redirect('/noticias/articleRedirect/'.$matches[2]); 
    } 
} 

Если старый URL выше функция будет передавать в функцию articleRedirect, которая будет перенаправлять на правый документ

// Function in articles controller to redirect old site's article url to 
// new websites url format 

function articleRedirect($article_id = NULL){ 
    $this->Article->recursive = -1; 
    $slug = $this->Article->findById($article_id);   
    if($slug == NULL){ 
     $this->Session->setFlash('Article not found'); 
     $this->redirect('/noticias'); 
    }else{ 
     $this->redirect('/noticia/'.$slug['Article']['slug']); 
    } 
} 

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

3

Самый простой способ - повторная модель вашего URL-адреса, чтобы по-прежнему содержать идентификатор статьи. Например:

http://www.example.com/noticia/4388/this-is-an-article-slug 

Затем вы можете создать 1 единственный RewriteRule переписать все старые URL, к этой новой структуре и использовать 1 маршрут, чтобы направлять их к действию вашего контроллера. Таким образом, для переноса старых URL-адресов потребуется только две строки конфигурации. Ваш путь будет выглядеть примерно так:

Router::connect(
    '/noticia/:article-id/:slug', 
    array('controller' => 'noticias', 'action' => 'view'), 
    array('pass' => 'article-id'), 
    'article-id' => '[0-9]+' 
); 

Что бы вызвать представление действия вашего NoticiasController и передать идентификатор статьи из URL к нему. RewriteRule вы должны добавить в ваш .htaccess должен выглядеть примерно так (непроверенный, но только, чтобы дать вам указатель):

RewriteRule ^/?c=[0-9]+&a=([0-9]+)$ /noticia/$1/ 
+0

Я пробовал, но он не работает. Что-то может быть неправильно с правилом перезаписи. Я буду продолжать пробовать разные вещи. В принципе, ничего не происходит, если я вхожу на www.mydomain.com/?c=135&a=1341. Он просто обращается к моей главной странице. –

+0

@CaboONE Да, переписывание должно быть просто включено/с RewriteCond в переменной% {QUERY_STRING}. Что-то вроде 'RewriteCond% {QUERY_STRING}^c = [0-9] + & a = ([0-9] +)' с 'RewriteRule ^// noticia /% 1 /' может это сделать. – Oldskool

+0

Я все еще не мог этого сделать. Я опубликовал решение, которое я решил использовать ... –

Смежные вопросы