2013-03-23 2 views
1

좋아요. 나는 내가 케이크 한 조각이라고 생각한 몇 개의 URL을 짧게하고 싶을 때까지 eveything이 늠름한 것 같다고 생각했습니다.또 다른 Htaccess 문제

나는 내 자신의 MVC 구조를 가지고있다. 모든 MVC 구조는 모든 페이지가 index.php를 통해 진행되며 url에 따라 실제 contollers와 모델이 즉시로드된다. 이렇게하면 멋지고 깨끗한 URL을 얻을 수 있으며 응용 프로그램을 더 쉽게 개발할 수 있습니다.

그래서 내 htaccess로 파일 내에서 I는 다음과 같습니다 ...

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L] 

내 index.php를 내 내가 필요한 컨트롤러 등의 URL 및로드의 길이를 계산

$length = count($url); 

if($length > 5) 
     { 
      $this->Error->index(); 
      return FALSE; 
     } 

    switch ($length) 
    { 
     case 5: 
      $controller_name->{$url[1]}($url[2], $url[3], $url[4]); 
      break; 

     case 4: 
      $controller_name->{$url[1]}($url[2], $url[3]); 
      break; 

     case 3: 

      $controller_name->{$url[1]}($url[2]); 
      break; 

     case 2: 
      $controller_name->{$url[1]}(); 
      break; 

     default: 
      $controller_name->index(); 
      break; 
    } 

이 모든 작업은 절대적으로 문제가되지 않으므로 여기에 제 문제가 있습니다. www.thepage.com/accounts/general_users/profile/[account_name]

그래서이 URL을 '계정/general_users가 /'나는 피곤 내 htaccess로 내에서 다음

RewriteRule ^profile/april.lee$  accounts/general_users/profile/april.lee [QSA,L] 

을하지만 내 초기 RewriteRule의 좋은 놀고 싶어하지 않는 것, 첫 번째 RewriteRule의 아래 그 자리는 그냥 렌더링하지 않는 경우, 위의 경우 응용 프로그램을 깰 것으로 보인다.

나는 무엇을 해야할지에 대해 꽤 난처했고,지도/조언을 조금 좋아할 것입니다. 정말 솔루션을 제안하고 전체 응용 프로그램을 다시 작업하지 않아도됩니다.

업데이트 내 컨트롤러와 모델로드 방법을 설명합니다 : 내가 얻을

1-하고 URL을 청소 :

// Get Clean URL 
$url = isset($_GET['url']) ? $_GET['url'] : NULL; 
$url = rtrim($url, '/'); 
$url = filter_var($url, FILTER_SANITIZE_URL); 
$url = explode('/', $url); 

// Start Session 
session_start(); 

// Create Application Core 
require_once(APP_PATH . "core/core.php"); 
$AC = new Application_Core($config); 

2 체크인이

if(empty($url[0])) 
{ 
     // Load and Instantiate Model 
    require(APP_PATH."models/m_index.php"); 
    $this->Model = new m_index(); 

    // Load and Instantiate Controller 
    require(APP_PATH."controllers/index.php"); 
    $controller = new index(); 
    $controller->index(); 
} 

else 
{ 

// Load and Instantiate Model 
     $model_file = APP_PATH."models/m_".$url[0].".php"; 
     if(file_exists($model_file)) 
     { 
      include($model_file); 
      $model_name = "m_".$url[0]; 
      $this->Model = new $model_name(); 
     } 
     else 
     { 
      echo $url[0]; 
      $this->Template->render_error($this->error_page, $this->error_message); 
      return FALSE; 
     } 

     // Load and Instantiate Controller 
     $controller_file = APP_PATH."controllers/".$url[0].".php"; 

     if(file_exists($controller_file)) 
     { 
      require(APP_PATH."controllers/".$url[0].".php"); 
      $controller_name = $url[0]; 
      $controller_name = new $controller_name(); 
     } 
     else 
     { 
      $this->Template->render_error($this->error_page, $this->error_message); 
      return FALSE; 
     } 

     $length = count($url); 

     // Check Method Exists 
     if ($length > 1) { 
      if (!method_exists($controller_name, $url[1])) { 
       $this->Template->render_error($this->error_page, $this->error_message); 
       return FALSE; 
      } 
     } 

     if($length > 5) 
     { 
      $this->Error->index(); 
      return FALSE; 
     } 

     switch ($length) 
     { 
      case 5: 
       $controller_name->{$url[1]}($url[2], $url[3], $url[4]); 
       break; 

      case 4: 
       $controller_name->{$url[1]}($url[2], $url[3]); 
       break; 

      case 3: 

       $controller_name->{$url[1]}($url[2]); 
       break; 

      case 2: 
       $controller_name->{$url[1]}(); 
       break; 

      default: 
       $controller_name->index(); 
       break; 


     } 
비어 있거나없는 경우

3 - 길이가 점검되고 적절한 컨트롤러 및 모델이로드됩니다.이 방법이 존재하지 않으면 사용자가 오류 페이지로 리디렉션됩니다.

+0

한다 RewriteRule^프로필 /(.*)$ 계정/general_users/프로필/$ 1 [QSA, L] 주석에 대한 – Adam

+0

안녕 @ 아담 덕분에,하지만 그 무시 무시한 (500) 내부를 불러 듯 서버 오류 페이지. – HireLee

+0

나는 대답의 의미를 더 잘 설명했다. – Adam

답변

0

URL의 길이를 제어하지 않아서 더 잘 처리 될 수있는 것처럼 보입니다. 누군가가 최단 링크 끝에 여분의 변수를 입력하여 어떤 일이 발생하는지 보려면 어떻게됩니까? 그들은 다른 사용자를위한 사이트에서 행동을 취할 것인가? 이것은 좋지 않을 수 있습니다.

htaccess를 사용하면 스위치가 두통을 줄이며 모든 작업을 수행 할 수 있습니다.

RewriteCond %{http_host} ^mysite.com/ [nc] 
RewriteRule ^(.*)$ http://www.mysite.com/$1 [nc] 

RewriteRule ^profile/(.*)$ accounts/general_users/profile/$1 [QSA, L] 
RewriteRule ^url_for_control1/match$ index.php?controller=1&%{QUERY_STRING} 

편집 :
당신의 index.php 파일이 작품은 그것이 무엇을 당신의 제어 기능은 다른 페이지로 사용자를 리디렉션하는 경우, 당신은 htaccess로 만들 수에 따라 달라집니다 만들려면 당신을 위해 그렇게.

예를 들어, 다음과 같습니다.페이지가 요청 된 방법에 따라 GET 또는 POST 변수를 사용하여 ...
http://www.mysite.com/index.php?first=john&last=doe&anyother=variables_sent

:
http://www.mysite.com/employees/john/doe

에 :

RewriteCond %{http_host} ^mysite.com/ [nc] 
RewriteRule ^(.*)$ http://www.mysite.com/$1 [nc] 

RewriteRule ^employees/(.*)/(.*)$ index.php?first=$1&last=$2&%{QUERY_STRING} 

는 요청을 리디렉션합니다.

이 사실을 알게되면 검색 엔진 친화적이며 사람이 읽고 이해하기가 쉬운 URL을보다 명확하게 만들 수 있습니다. url의 특정 특성을 검색하고 사용할 함수를 제어하는 ​​변수를 통해 index.php 페이지에 알려줌으로써 index.php에 요청을 계속 보낼 수 있습니다.

쉽게 변경하고 업그레이드 할 수있는 사이트를 만드는 등 많은 이유에 대한 URL 문자의 양만을 기준으로 페이지에 대한 조치를 결정하는 것은 좋지 않습니다.

Net Tuts has a decent beginners tutorial as well for htaccess.

+0

안녕하세요, 아담, 조금 혼란스러워 htaccess에 익숙하지 않은 것처럼 보입니다. index.php 파일의 내부 동작을 보여주기 위해 제 질문을 업데이트했습니다 ... 위의 코드를 구현하여 색인을 작성하는 방법은 무엇입니까? PHP는 ... 조금 혼란스러워 ... 환호 리 – HireLee

+0

@LeeMarshall 나는 그것을 조금, 감사 확장했습니다. – Adam