2009-10-29 2 views
1

CakePHP에서 간단한 리디렉터 컨트롤러를 만들려고합니다. 내가 리디렉션해야하는 URL은 슬래시, 매개 변수와 앵커를 포함, 물론, 더 복잡 할 수간단한 URL 리디렉터의 라우팅 구성 및 컨트롤러 동작 매개 변수

http://example.com/redirector/1/http://www.google.com 

, 예를 들어

http://example.com/redirector/<numeric id>/<url to redirect to> 

: 나는 형태로 URL을하고 싶습니다 .

내가 좋아하는 내 행동이 보일 것이다 그래야 경로 구성을 작성하는 방법을 알아낼 수있을 것 없습니다

:

class RedirectsController extends AppController { 

    function myredirectaction($id, $url) { 
     $this->autoRender = false; 
     $this->redirect($url); 
    } 

그것은 내가는 "/"의 시도 어떤 것 같아 url-to-redirect-는 내 경로 시도를 혼란스럽게 만들고 URL을 조각으로 나눠서 더 이상 내 동작 정의와 일치하지 않습니다. 어떻게해야합니까?

저는 PHP와 CakePHP에 익숙하지 않으므로 조언을 해주시면 감사하겠습니다.

업데이트 :

그래서 대신 예제 URL 위가되었습니다 URL 이스케이프 같이하기 :

http://example.com/redirector/1/http%3A%2F%2Fwww.google.com 

하지만, 내 라우팅이 여전히 작동하지 않습니다. 여기에 내가 routes.php에 무엇을 : 그것은 두 예상 인수를하지 않았기 때문에 내 행동에서

Warning (2): array_merge() [function.array-merge]: Argument #1 is not an array [CORE/cake/dispatcher.php, line 301] 

Code | Context 

$fromUrl = "redirector/1/http://www.google.com" 
$params = array(
    "pass" => array(), 
    "named" => array(), 
    "id" => "1", 
    "url" => "http://www.google.com", 
    "plugin" => null, 
    "controller" => "redirects", 
    "action" => "myredirectaction", 
    "form" => array() 
) 
$namedExpressions = array(
    "Action" => "index|show|add|create|edit|update|remove|del|delete|view|item", 
    "Year" => "[12][0-9]{3}", 
    "Month" => "0[1-9]|1[012]", 
    "Day" => "0[1-9]|[12][0-9]|3[01]", 
    "ID" => "[0-9]+", 
    "UUID" => "[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" 
) 
$Action = "index|show|add|create|edit|update|remove|del|delete|view|item" 
$Year = "[12][0-9]{3}" 
$Month = "0[1-9]|1[012]" 
$Day = "0[1-9]|[12][0-9]|3[01]" 
$ID = "[0-9]+" 
$UUID = "[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" 
$url = array(
    "url" => "/redirector/1/http://www.google.com" 
) 

array_merge - [internal], line ?? 
Dispatcher::parseParams() - CORE/cake/dispatcher.php, line 301 
Dispatcher::dispatch() - CORE/cake/dispatcher.php, line 118 
[main] - APP/webroot/index.php, line 88 

그리고 더 경고 :

Router::connect(
    '/redirector/:id/:url', 
    array('controller' => 'redirects', 'action' => 'myredirectaction'), 
    array(
     'id' => '[0-9]+', 
     'url' => 'http.*' 
    ) 
); 

이 내가 그 URL을하려고 할 때 무엇을 얻을 수 있습니다.

물론 $ url을 사용하기 전에 동작을 urldecode ($ url)로 변경했습니다.

답변

2

슬래시 및 기타 특수 문자를 배치하려면 대신 ACSII 코드를 사용하십시오. 코드 및 해당 문자의 목록은이 문서를 참조하십시오 :

http://www.ascii.cl/htmlcodes.htm

+0

그것은 밝혀도에 의한 URL을 인코딩 할 때, 서버는 여전히 디코드 된 URL을 PHP로 전달하고있었습니다. 이는 서버 구성을 변경하여 변경 될 수 있지만 모든 경우에 대한 옵션은 아닙니다. –

1

당신은 당신의 행동에 변수를 전달하는 패스 배열을 추가해야합니다. http://book.cakephp.org/view/543/Passing-parameters-to-action

+0

그게 실제로 도움이 되긴하지만 인코딩/디코딩 문제와 경로 분리 기호로 인해 내가 원하는 방식으로 URL을 처리하기에는 아직 충분하지 않습니다. –

+0

URL에 콜론과 가능한 물음표가 있기 때문에 URL을 URL로 인코딩해야합니다. 그렇지 않으면 func_get_args()를 호출하고 인수를 직접 슬래시로 다시 결합 할 수 있습니다. 다른 http 서버에 대해서는 잘 모르겠지만 Apache를 사용하고 있다면 AllowEncodedSlashes가 설정되어 있는지 확인할 수도 있습니다. 인코딩 된 URL이 켜져 있지 않으면 문제가 발생할 수 있습니다. – Jason

0

내가 원래 기대했다처럼 URL과 함께이 일을 할 수없는 것 :

Router::connect(
     '/redirector/:id/:url', 
     array('controller' => 'redirects', 'action' => 'myredirectaction'), 
     array(
       'id' => '[0-9]+', 
       'url' => 'http.*', 
       'pass' => array('id', 'url') 
     ) 
); 

당신은 왜 여기에 대한 자세한 정보를 찾을 수 있습니다. 내가 할 수 있었던 최선의 방법은 매개 변수에서 리디렉션 할 URL을 제공하는 것입니다.

Router::connect(
     '/redirector', 
     array('controller' => 'redirects', 'action' => 'myredirectaction') 
); 

그리고 컨트롤러 액션이된다 (에러가 생략 핸들링) : 그래서 라우팅은 간단하게

function myredirectaction() { 
    $this->autoRender = false; 
    $redirect_url = $this->params['url']['theurl']; 
    $this->redirect($redirect_url); 
} 

을 그리고 URL의 형식은 :

http://example.com/redirector?theid=1&theurl=http://www.google.com