9

私のリダイレクトプロセスは、いくつかのクレイジーなものを示しています。ループ全体の最初の部分は問題なく機能します(最初の要素のみが入力されている場合)。

可能なURLは次のようになります。

www.site.com/category

www.site.com/category/product

だけでなく:

www.site.com/cart

site.com/jeansの使用は問題なく機能します。しかし、製品をクリックすると、何か奇妙なことが起こります。

categorie.phpファイル(カテゴリの表示に使用)はまだ含まれており、その後にproduct.phpファイルが含まれています。

カートページ(http://www.site.com/winkelwagen/)と同じ話。

だから私のインクルードはある時点で間違っています。Winkelwagenは、インデックスファイルがある私のサイトのフォルダです。categorie.phpではなく、 http://www.site.com/winkelwagen/index.phpを含める必要があります。

ルートコード:

<?php

$mult = Array();
if( ! empty( $_SERVER[ 'REQUEST_URI' ] ) ) {
$mult = explode ( '/', substr ( $_SERVER[ 'REQUEST_URI' ], 1 ) );
} else if( ! empty( $_SERVER[ 'ORIG_PATH_INFO' ] ) ) {
$mult = explode ( '/', substr ( $_SERVER[ 'ORIG_PATH_INFO' ], 1 ) );   
} else if( ! empty( $_SERVER[ 'PATH_INFO' ] ) ) {
$mult = explode ( '/', substr ( $_SERVER[ 'PATH_INFO' ], 1 ) );
}

if(empty($mult[0]))
{
include("comingsoon/index.html");
}

if(!empty($mult[0]) && empty($mult[1]))
{
$file = "$mult[0].php";
if($mult[0] == "index2")
{
    include("index2.php");
    die;
}
// if file exists include file
if(file_exists($file))
{
    include($file);
}
else 
{
    $file2 = "/$mult[0]/index.php";

    // if folder index file exists include that file
    if(file_exists($file2))
    {
        include($file2);
    }   
    else {
        // if folder index file doesn't exist, send to category page
        $_GET['q'] = $mult[0];
        include("categorie.php");
    }
}
}
if(!empty($mult[0]) && !empty($mult[1]))
{
if($mult[0] == "add")
{
    $_GET['addid'] = $mult[1];
    include("addtocart.php");
}
elseif($mult[0] == "remove")                    
{
    $_GET['removeid'] = $mult[1];
    include("deletefromcart.php");
}
// check if folder exists (first part of the url)
elseif(is_dir($mult[0]))
{
    // check if file .php (second part of the url) exists
    $filenew = "$mult[0]/$mult[1].php";

    if(file_exists($filenew))
    {
        // include that file
        include("$mult[0]/$mult[1].php");
    }
    else 
    {
        // second file does not exist, do something
    }
}
else 
{
    // folder does not exist so redirect to product page
    $_GET['c'] = $mult[0];
    $_GET['p'] = $mult[1];
    include("product.php");
}
}
?>

categorie.phpファイルを削除しようとしましたが、それでも表示されます(たとえば、一体どうやって?!)

私は答えに興奮しています-私は自分が何を間違っているのか全くわかりません。

また、知っておくと便利です。ルートコードのinclude(categorie.php)部分をコメントアウトすると、ファイルはまだ含まれています...

4

2 に答える 2

13

OK...スタックオーバーフローへようこそ。まず、リンクを投稿することは許可されていると言います。少なくとも私にとっては、「ドット」を使用してリンクを中断しようとすると、実際にはスパムのように感じます。

引き続き、サイトとそのコードを公開しないようにアドバイスします。さまざまなセキュリティの脆弱性がありますが、これについては詳しく説明しません。しかし、なぜあなたのユーザーがd284h1と呼ばれるのか、そしてなぜあなたのサイト/ホームがマウントポイントにあるのか興味があります/mnt/home/d284h1...

私の言葉に注意してください。ルーティングロジックとサイトを非常に公開されたサイトに投稿しました。


あなたのコードについて。実際のソースコードではなく、インデントを破壊していることを心から願っています。

いくつかの制御ロジックがありません。それらのいくつかは、あなたが経験していたファイルインクルードにつながっている可能性があります。また、サイトパスではなく、ルートディレクトリのファイルをテストしてインクルードしている可能性のあるバグにも気づきました。

更新:実際に元のコードを振り返ると、ファイルを完全に参照するとロード$file2 = "/$mult[0]/index.php";が発生categorie.phpまた、適切な制御ロジックがないため、ファイルに複数のインクルードが発生していました。


穏やかに、コードを修正する自由を取りました。以下のコードは、ランダムファイルを含め続けるべきではありません。含まれているファイル自体がそれを行わない限り。

$mult = array();
if( ! empty( $_SERVER[ 'REQUEST_URI' ] ) ) {
    $mult = explode ( '/', substr ( $_SERVER[ 'REQUEST_URI' ], 1 ) );
} else if( ! empty( $_SERVER[ 'ORIG_PATH_INFO' ] ) ) {
    $mult = explode ( '/', substr ( $_SERVER[ 'ORIG_PATH_INFO' ], 1 ) );   
} else if( ! empty( $_SERVER[ 'PATH_INFO' ] ) ) {
    $mult = explode ( '/', substr ( $_SERVER[ 'PATH_INFO' ], 1 ) );
}

if (empty($mult[0])) {
    include("comingsoon/index.html");
    die; #missing
}
# no need to test for !empty($mult[0]), if it were empty, the above die would fire
if (empty($mult[1])) {
    $file = "$mult[0].php";
    if($mult[0] == "index2") {
        include("index2.php");
        die;
    }
    // if file exists include file
    if (file_exists($file)) {
        include($file);
        die; # missing die
    } # no need for else, you just die'd

    # renamed $file2 to $file, don't use temporary variable names in global scope. It clutters your application
    $file = "$mult[0]/index.php";# are you sure you meant to include from the root level?
    // if folder index file exists include that file
    if (file_exists($file)) {
        include($file);
        die;# missing die
    } # no need for else, you just die'd

    // if folder index file doesn't exist, send to category page
    $_GET['q'] = $mult[0];
    include("categorie.php");
    die;# missing die
}

# don't do succesive if/elseif on the same variable, use a switch!
switch($mult[0]) {
    case'add':
        $_GET['addid'] = $mult[1];
        include('addtocart.php');
        break;
    case'remove':
        $_GET['removeid'] = $mult[1];
        include('deletefromcart.php');
        break;
}
if (is_dir($mult[0])) {
    // check if file .php (second part of the url) exists
    $filenew = "$mult[0]/$mult[1].php";
    if(file_exists($filenew)) {
        // include that file
        include("$mult[0]/$mult[1].php");
        die; # missing die
    }
} else {
    // folder does not exist so redirect to product page
    $_GET['c'] = $mult[0];
    $_GET['p'] = $mult[1];
    include("product.php");
}

私の更新にはコメントが付けられていますが#、これは決して最終的な形ではありません。コーディング標準とは何かについて、 PSR1を見て穏やかなアイデアを見つけてください。これらは、最初は面倒だと感じていたにもかかわらず、究極のコードの探求を支援し、より熟練させることを目的としています。

私が続けたい他のことは次のとおりです。

  1. $ varが文字列の場合、と交換!empty($var)するisset($var[0])
  2. メインスコープにいる場合は、と交換include($file);die;しますreturn include $file;
  3. if/elseifブロックを三項演算子で交換する

実際に#3に関して、ここに例があります:

$mult = isset($_SERVER['REQUEST_URI'][0])
        ? $_SERVER['REQUEST_URI']
        : isset($_SERVER['ORIG_PATH_INFO'][0])
            ? $_SERVER['ORIG_PATH_INFO']
            : isset($_SERVER['PATH_INFO'][0])
                ? $_SERVER['PATH_INFO']
                : false
        ;
$mult = $mult
        ? explode('/', substr($mult, 1))
        : array();

PS使用しているコードは使用すべきではないと思うので、私はあなたが抱えていたセキュリティの問題を修正しませんでした。フレームワークを使用するか、少なくとも1つのフレームワークから学習することを検討してください。ルーティングは優れたMVCの要であり、正しい道を進んでいます。一歩先を進んでください。

于 2013-01-19T02:40:22.417 に答える
0

これもテストしてフィードバックを送っていただけませんか。コードを再構築しました(elseif elseを使用して条件をより厳密にしました)

<?php

$mult = Array();
if( ! empty( $_SERVER[ 'REQUEST_URI' ] ) ) {
$mult = explode ( '/', substr ( $_SERVER[ 'REQUEST_URI' ], 1 ) );
} else if( ! empty( $_SERVER[ 'ORIG_PATH_INFO' ] ) ) {
$mult = explode ( '/', substr ( $_SERVER[ 'ORIG_PATH_INFO' ], 1 ) );   
} else if( ! empty( $_SERVER[ 'PATH_INFO' ] ) ) {
$mult = explode ( '/', substr ( $_SERVER[ 'PATH_INFO' ], 1 ) );
}

if(empty($mult[0]))
{
  include("comingsoon/index.html");
}

elseif(!empty($mult[0]) && empty($mult[1]))
{
  $file = "$mult[0].php";
  if($mult[0] == "index2")
  {
      include("index2.php");
      die;
  }
  else{
    // if file exists include file
    if(file_exists($file))
    {
        include($file);
    }
    else 
    {
        $file2 = "/$mult[0]/index.php";

        // if folder index file exists include that file
        if(file_exists($file2))
        {
            include($file2);
        }   
        else {
            // if folder index file doesn't exist, send to category page
            $_GET['q'] = $mult[0];
            include("categorie.php");
        }
    }
  }
}
elseif(!empty($mult[0]) && !empty($mult[1]))
{
  if($mult[0] == "add")
  {
      $_GET['addid'] = $mult[1];
      include("addtocart.php");
  }
  elseif($mult[0] == "remove")                    
  {
      $_GET['removeid'] = $mult[1];
      include("deletefromcart.php");
  }
  // check if folder exists (first part of the url)
  elseif(is_dir($mult[0]))
  {
      // check if file .php (second part of the url) exists
      $filenew = "$mult[0]/$mult[1].php";

      if(file_exists($filenew))
      {
          // include that file
          include("$mult[0]/$mult[1].php");
      }
      else 
      {
          // second file does not exist, do something
      }
  }
  else 
  {
      // folder does not exist so redirect to product page
      $_GET['c'] = $mult[0];
      $_GET['p'] = $mult[1];
      include("product.php");
  }
}
?>
于 2013-01-25T21:00:23.543 に答える