2017-12-31 196 views
0

ユーザーがWYSIWYGエディタを使用してコンテンツを投稿できるWebサイトを作成しようとしています。私の.htaccessファイルでは、私はダイナミックリンクが挿入されているWebサイトの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エディタを使用して他のWebサイトのタグをテキストの参照として挿入できるため、重要です。だから私の質問は、私はこれを正しくやっているのですか、私は別のアプローチが必要ですか?もしそうなら、どのアプローチ?私はfacebookやtwitterのようなサイトで使われているものと同様のアプローチを大いに参考にしています。

+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フレームワークと似た方法を使用します(しかし単純です)。

だから、最初のスキーマを考案する必要があり、私はそれで意味することは、この

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

その後、あなたはURLを解析行くようにルータを建設するようなものです。私はあなたに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つの方法しかありません。

私はそれがちょうどControllers/user.phpの代わりにControllers/user/home.phpのようなサブフォルダにコントローラを置くことができないということを意味しています。これは中小規模のサイトでは問題ありませんが、大きなサイトが異なる場合は、コントローラをネストすることが望ましい場合があります。しかし、これはそれに複雑さを追加します。

個別にルートを作成するのではなく、この方法の利点は明白です。ルート(URL)が私が概説した単純なスキーマに従う限り、コードに触れる必要はありません。これにより、サイトのセクションを機能別に独自のファイルに編成することもできます。たとえば、user.phpコントローラを使用します。ログイン、プロファイル、ログアウトページなどのすべての機能を1つの場所に置くことができます。

member.phpコントローラを追加する場合は、ログに記録するだけのものをすべて入れることができますそこにユーザがいます。そのコントローラの__constructメソッドでは、現在のセッションがログインしていて、そのファイルのすべてのメソッドをカバーしているかどうかをチェックします。

URLスキーマはhttp://example.com/{controller}/{method}/{args ... }です。しかし、このようなURLを使用することもできますhttp://example.com/index.php/{controller}/{method}/{args ... }。あなたは、あなたがURLにindex.phpを入れて(またはいくつかの他の手段でそれを削除)する必要があることはありませんので、もし私が

はREWRITE_BASE

、URLでindex.phpの除去を可能にするためにModの書き換えを使用しています私のローカルテストサーバーでは、仮想ホストをセットアップするのが怠惰なので、すべての場所を自分のフォルダに入れます。ですから、この定数を変更し、一致する.htaccessの値をあなたのサブフォルダが何であれ(おそらく何もない)に変更したいとします。ここでは、サブフォルダ内で使用する方法の例を挙げておきました。

最後に、これは従来のMVCアーキテクチャのCです。コントローラでは "ビジネスロジック"と呼ばれることを避けるべきですが、コントローラから直接HTMLを出力しないようにする必要があります(例ではこれを行っていますが)。 HTMLを出力するのではなく、BladeTwigのようなテンプレートエンジンを使用することをお勧めします。 「モデル(ビジネスロジック)」を「ビュー(テンプレート)」に結合する「接着剤」のようなコントローラーを考えてみましょう。ビジネスロジックは、ユーザーのデータベース機能を処理するユーザークラス(名詞のような大文字のU、ユーザーコントローラーのような小文字ではない)のようになります。したがって、コントローラにそのコードを置く代わりに、 "User Model"を構築し、それをコントローラにインポートします。これは「正しい方法」ですが、もちろん複雑さが増しますが、後でその組織を見れば時間を節約することができます。今

いくつかの例

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ルートにhome::index()
  • http://example.com/home/indexルートにhome::index()
  • http://example.com/homeルートにhome::index()
  • http://example.com/index.phpルートに

    • http://example.com/ルート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ルートにuser::index()
  • http://example.com/user/indexルートに

    • http://example.com/userルートはこれの残りの部分はほとんど同じですが、私はコントローラをfで整理する方法を示したかっただけですサイトのために無関係。

      これは、URL内の{method}に続く引数の数に制限がないことに注意してください。

      お楽しみください!

  • +0

    私に1つ書いてもらえれば分かります。私はそれで数日間苦労してきた –

    関連する問題