2012-02-10 3 views
1

모든, 나는 현재 완전히 내 현재의 뉴스 사이트를 개편 CakePHP를 사용하고CakePHP의 : 라우팅 문제

. 현재 사이트의 모든 기사를 새로운 사이트로 이전했거나 현재 사이트와 동일한 내용으로 변경합니다. article_id 그러나, 나는 다음과 같은 문제를 깨달았다.

나의 현재 사이트 URL로 다음과 같은 설정을 사용

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

c= 참조 범주 ID 및 a= 참조 문서 ID를. 나의 새로운 설정 (CakePHP를) 나는 굼벵이를 활용하고 이제 내 기사의 URL이 표시 :

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

이 때문에 내가 webstats 통해, 발견 한 내 기사의 대부분이 페이스 북과 같은 다른 사이트에 링크 설정을 통해 액세스됩니다, , 나는이 문제를 해결할 시스템/경로를 만드는 것이 중요하다고 생각했다. ,

  1. 이 경로 내 기사 컨트롤러에 리디렉션 기능에 매개 변수로 a 값을 전달합니다
  2. 위에서 언급 한 것과 비슷한 요청을 감지하는 경로를 만듭니다

    이 내가 생각하고 무엇을 같은 articleRedirect($article_id)

  3. 으로이 기능은 다음 전달 $article_id에 따라 slug에 대한 데이터베이스에서 찾아 볼 것이며, 새 주소로 리디렉션

    ,536 (아래 함수를 참조)
    // 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에 대한 도움을 의지하십시오. 그러나, 그것을 구현하는 데 어려움이있었습니다. 나는 사용하지 않기로 마음 먹었다.

app_controller'sbeforeFilter() 내가 다음에 추가 내에서 : 내 app_controller.php에서 다음

//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(); 

나는 다음과 같은 기능을 만들었을 htaccess로 또는 경로와 같은 나를 위해 그것을 처리 할 app_controller의 기능을 구현하기 위해 선택했다 :

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

가장 쉬운 방법은 기사 ID를 유지하기 위해 URL을 약간 다시 모델링하는 것입니다. 예를 들어 :

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

그런 다음이 새로운 구조로 기존의 모든 URL의 재 작성하고이 컨트롤러의 행동에 경로에 1 개 경로를 사용하는 1 명 싱글한다 RewriteRule을 만들 수 있습니다. 이렇게하면 기존 URL을 새 URL로 이전하는 데 2 ​​줄만 소요됩니다.

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

당신의 NoticiasController의 뷰 액션을 호출하고 그것에 URL에서 문서 ID를 전달합니다 : 귀하의 경로는 다음과 같이 보일 것입니다. 당신이하려는 RewriteRule의는 다음과 같이 보일 것입니다 당신의 .htaccess에 추가 (테스트되지 않은,하지만 당신에게 포인터를 제공하기 위해) :

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

시도했지만 작동하지 않습니다. 다시 쓰기 규칙에 문제가있을 수 있습니다. 나는 계속 다른 일을 시도 할 것입니다. www.mydomain.com/?c=135&a=1341을 입력하면 기본적으로 아무런 문제가 없습니다. 그것은 단순히 내 frontpage에 액세스합니다. –

+0

@CaboONE 예, 재 작성은 % {QUERY_STRING} 변수의 RewriteCond를 /로 사용해야합니다. 'RewriteRule ^// noticia/% 1 /'과 함께'RewriteCond % {QUERY_STRING}^c = [0-9] + & a = ([0-9] +)'와 같은 일이 일어날 수 있습니다. – Oldskool

+0

나는 아직도 그것을 할 수 없었다. 내가 사용하기로 결정한 솔루션을 게시했습니다 ... –