2017-12-31 304 views
0

사용자가 WYSIWYG 편집기를 사용하여 콘텐츠를 게시 할 수있는 웹 사이트를 만들려고합니다. 내 .htaccess 파일에서 나는 가지고있다.동적 링크가 삽입 된 웹 사이트에 대해 URL 재 작성을 설정하는 방법

FallbackResource index.php 

성공적으로 모든 요청을 index.php 파일에 보내고있다. 원하는 파일을 얻기 위해 PHP를 사용하고 있습니다.

$path = explode('/', $_SERVER['REQUEST_URI']); 
//[SCRIPT_FILENAME] => C:/xampp/htdocs/tests/index.php 
if($path[2] == 'notifications'){ 
    require_once 'notifications.php'; 
} 

이 모든 것이 정상적으로 작동합니다. 문제는 google.com과 같은 외부 링크로 리디렉션하려고 할 때 발생합니다. 링크 자체가 리디렉션되지 않고 인덱스 페이지로 리디렉션됩니다. 사용자가 WYSIWYG 편집기를 사용하여 다른 웹 사이트의 태그를 텍스트의 참조로 삽입 할 수 있기 때문에 이것이 핵심입니다. 그래서 제 질문은, 제가이 일을 올바르게하고 있습니까 아니면 다른 접근이 필요합니까? 그렇다면 어떤 접근 방식을 취하고 있습니까? 페이스 북이나 트위터와 같은 사이트에서 사용하는 것과 유사한 접근법에 크게 감사 할 것입니다.

+0

어떻게 외부 링크가 내부적으로 리디렉션됩니까? 실수로 링크를 내부로 변경하고 있습니까? 이게 뭐지? 내 .htaccess 파일에 FallbackResource index.php가 있습니다. 당신이 사용하는 .htaccess 규칙 중 일부를 공유 할 수 있습니까? 예를 들어 실제 이름 대신 'www.mysite.com'을 사용할 수있는 호스트와 같이 공개하기를 원하지 않는 것을 제거해야합니다. – ArtisticPhoenix

+1

아주 작은 PHP는 괜찮지 만, 정의에 의해 다른 서버를 호출 할 때처럼 외부 요청을 내부적으로 처리해서는 안됩니다. IE. 당신은 그것을 이해하기에 충분한 정보를주지 않았습니다. – ArtisticPhoenix

+0

FallbackResource index.php는 내 .htaccess 파일에서 index.php 파일을 사용하거나 폴백하도록 지시하는 유일한 코드입니다. .htaccess를 사용하는 대신 PHP를 사용하여 하드 코드를 작성하려고합니다. –

답변

0

접근 방법으로는 CodeIgniter 또는 다른 MVC 프레임 워크와 비슷한 방법을 사용합니다 (그러나 더 간단합니다).

그래서 먼저 스키마를 고안해야한다, 내가 그 뜻은 그런 다음 URL을 구문 분석가는 라우터를 구축 할 것이

www.yoursite.com/index.php/{controller}/{method}/args ... 

같은 것입니다. 나는 너에게 편지를 쓸 수는 있지만 1 분 정도 걸릴 것이다.

SimpleRouter.php

/** 
* A simple 1 level router 
* 
* URL schema is http://example.com/{controller}/{method}/{args ... } 
* 
* @author ArtisticPhoenix 
* @package SimpleRouter 
*/ 
class SimpleRouter{ 

    /** 
    * should be the same as rewrite base in .htaccess 
    * @var string 
    */ 
    const REWRITE_BASE = '/MISC/Router/'; 

    /** 
    * path to controller files 
    * 
    * @var string 
    */ 
    const CONTOLLER_PATH = __DIR__.'/Controllers/'; 

    /** 
    * route a url to a controller 
    */ 
    public static function route(){ 
     //normalize 
     if(self::REWRITE_BASE != '/'){ 
      $uri = preg_replace('~^'.self::REWRITE_BASE.'~i', '',$_SERVER['REQUEST_URI']); 
     } 
     $uri = preg_replace('~^index\.php~i', '',$uri);  
     $uri = trim($uri,'/'); 

     //empty url, like www.example.com 
     if(empty($uri)) $uri = 'home/index'; 

     //empty method like www.example.com/home 
     if(!substr_count($uri, '/')) $uri .= '/index'; 

     $arrPath = explode('/', $uri); 

     $contollerName = array_shift($arrPath); 
     $methodName = array_shift($arrPath);; 
     $contollerFile = self::CONTOLLER_PATH.$contollerName.'.php'; 

     if(!file_exists($contollerFile)){ 
      //send to error page 
      self::error404($uri); 
      return; 
     } 

     require_once $contollerFile; 

     if(!class_exists($contollerName)){ 
      self::error404($uri); 
      return; 
     } 

     $Controller = new $contollerName(); 

     if(!method_exists($Controller, $methodName)){ 
      self::error404($uri); 
      return; 
     } 

     if(!count($arrPath)){ 
      call_user_func([$Controller, $methodName]); 
     }else{ 
      call_user_func_array([$Controller, $methodName], $arrPath); 
     } 
    } 

    /** 
    * call error 404 
    * 
    * @param string $uri 
    */ 
    protected static function error404($uri){ 
     require_once self::CONTOLLER_PATH.'home.php';  
     $Controller = new home(); 
     $Controller->error404($uri); 
    } 
} 

기본 컨트롤러 홈 :

UPDATE

당신은 내 GitHub의 페이지 here

에 그러나 여기에 refrence 위해 그것을 찾을 수 있습니다 코드입니다. PHP

/** 
* 
* The default controller 
* 
* @author ArtisticPhoenix 
* @package SimpleRouter 
*/ 
class home{ 

    public function index($arg=false){ 
     echo "<h3>".__METHOD__."</h3>"; 
     echo "<pre>"; 
     print_r(func_get_args()); 
    } 

    public function otherpage($arg){ 
     echo "<h3>".__METHOD__."</h3>"; 
     echo "<pre>"; 
     print_r(func_get_args()); 
    } 

    public function error404($uri){ 
     header('HTTP/1.0 404 Not Found'); 
     echo "<h3>Error 404 page {$uri} not found</h3>"; 
    } 

} 

2 컨트롤러 (예) user.php

/** 
* 
* An example users router 
* 
* @author ArtisticPhoenix 
* @package SimpleRouter 
*/ 
class user{ 

    public function index(){ 
     echo "<h3>".__METHOD__."</h3>"; 
    } 


    public function login(){ 
     echo "<h3>".__METHOD__."</h3>"; 
    } 

} 

재 작성 (제거의 index.php) htaccess로 내가 갔다

require_once __DIR__.'/SimpleRouter.php'; 
SimpleRouter::route(); 

index.php를 마지막으로

RewriteEngine On 

# For sub-foder installs set your RewriteBase including trailing and leading slashes 
# your rewrite base will vary, possibly even being/if no sub-foder are involved 
RewriteBase /MISC/Router/ 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L] 

라우터에 static 전화를 걸면 간단한 일을 유지할 수 있습니다. 이런 식으로 클래스의 인스턴스가 필요하지 않습니다. 어쨌든 2 가지 방법 (1 공개) 만 있습니다.

단일 레벨 라우터로 구축했는데, 그게 바로 Controllers/user.php 대신 Controllers/user/home.php 같은 컨트롤러를 하위 폴더에 둘 수 없다는 것을 의미합니다. 중소 규모 사이트의 경우이 값이 적절해야하지만 다양한 대규모 사이트의 경우 컨트롤러를 중첩하는 것이 바람직 할 수 있습니다. 그러나 이것으로 인해 복잡성이 추가됩니다.

개별적으로 경로를 만드는 대신이 방법의 장점이 분명해야합니다. 라우트 (url)가 내가 설명한 간단한 스키마를 따르는 한 코드를 만질 필요가 없습니다.또한 기능별로 사이트 섹션을 자체 파일로 구성 할 수 있습니다. 예를 들어 컨트롤러는 user.php입니다. 로그인, 프로필, 로그 아웃 페이지 등과 같은 모든 기능을 한 곳에 넣을 수 있습니다.

member.php 컨트롤러를 추가하려면 기록하려는 모든 항목을 기록 할 수 있습니다 사용자가 있습니다. 그리고 그 컨트롤러의 __construct 메소드에서 현재 세션이 로그인되어 있는지, 그리고 그 파일에 대한 모든 메소드를 포함하고 있는지 확인합니다.

URL 스키마는 http://example.com/{controller}/{method}/{args ... }입니다. 그러나 당신은 또한 http://example.com/index.php/{controller}/{method}/{args ... }과 같은 URL을 사용할 수 있습니다. 나는 URL에서 index.php의 제거를 허용하는 모 재 작성을 사용하고, 그래서 당신은 그이없는 경우는 URL에 index.php을 넣어 (또는 다른 수단에 의해 제거)

REWRITE_BASE을 내 로컬 테스트 서버에서 가상 호스트를 설정하는 것을 게으 르기 때문에 모든 폴더를 자체 폴더에 배치합니다. 그래서이 상수와 일치하는 .htaccess 값을 하위 폴더가 무엇이든간에 (아마 아무 것도 아닐지라도) 변경하고 싶을 것입니다. 여기에 하위 폴더 내에서 사용하는 방법에 대한 예제 만 남았습니다.

마지막으로 이것은 전통적인 MVC 아키텍처에서 C입니다. 컨트롤러에서 "비즈니스 로직"을 수행하는 것을 피해야합니다. 컨트롤러에서 직접 HTML을 출력하지 않아야합니다 (예제에서이 작업을 수행 했음에도 불구하고). HTML을 출력하는 대신, Blade 또는 Twig과 같은 템플릿 엔진을 사용하는 것이 좋습니다. "모델 (비즈니스 로직)"을 "뷰 (템플릿)"에 조인하는 "접착제"와 같은 컨트롤러를 생각해보십시오. 비즈니스 로직은 사용자 클래스 (대명사와 같은 대문자 U, 사용자 컨트롤러와 마찬가지로 소문자가 아닌)와 같을 것이며 사용자를위한 데이터베이스 기능을 처리합니다. 따라서 컨트롤러에 바로 코드를 삽입하는 대신 "사용자 모델"을 만들어 컨트롤러로 가져올 수 있습니다. 이것은 "옳은 길"이지만, 당연히 약간의 복잡성을 더합니다. 그러나 나중에 시간을 절약하는 것보다 훨씬 더 중요하다는 것을 알게 될 것입니다.지금

일부 예

404 오류 (부재중 노선)

  • http://example.com/foohome::error404()에 경로를 출력 home::error404()-<h3>Error 404 page foo/index not found</h3>

  • http://example.com/home/foo 노선 및 출력 <h3>Error 404 page home/foo not found</h3>

기본 홈 페이지 : home::index()

  • http://example.com/home/index/hello 루트,887에에 home::index()
  • http://example.com/home/index 경로에 home::index()
  • http://example.com/home 경로에

    • http://example.com/ 루트 home::index()-
    • http://example.com/index.php 경로 home::index('hello','world')

    -

  • http://example.com/home/index/hello/world 경로는 당신이 집에 대한 인수의 전체 경로를 넣어야 할 의미 바와 같이, 위의 코드는이 설명하기 위해 변경 될 수 있지만, 누락 된 페이지에 대한 몇 가지 영향이있다. 기본적으로 누락 된 페이지는 컨트롤러의 인수가됩니다. 따라서 http://example.com/user/foo이 있다면 user::index('foo')이 호출됩니다. 물론 이것 역시 설명 될 수 있지만 복잡성이 쌓이기 시작합니다.

    • http://example.com/home/otherpagehome::otherpage()으로 라우팅되지만 누락 된 인수에 대한 경고를 발행합니다. home::otherpage('hello')

    당신이 보는 경우

  • - home::otherpage('hello')
  • http://example.com/index.php/home/otherpage/hello 경로에
    • http://example.com/home/otherpage/hello 경로 : home::index($arg=false)이 방법은하지 않는 기본을 정의합니다. 따라서이 방법에는 인수가 필요합니다. 나머지는 꽤 자명해야합니다.

      두 번째 컨트롤러 사용자 예 : user::login()

    user::index()

  • http://example.com/user/login 경로에

    • http://example.com/user 루트 user::index()
    • http://example.com/user/index 노선이의 나머지 부분은 내가 거의 동일 단지 컨트롤러를 f로 구성하는 방법을 보여주고 싶었습니다. 무의식적으로 사이트에 대한.

      URL에있는 {method} 다음에 오는 무제한의 인수를 처리 할 수 ​​있습니다.

      즐기십시오!

  • +0

    나를 쓸 수 있으면 감사하겠습니다. 나는 그것으로 며칠 동안 고투하고있다. –