9

我的重定向过程显示了一些疯狂的东西。整个循环的第一部分工作得很好(如果只输入第一个元素)。

可能的网址如下所示:

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 是我网站上的一个文件夹,它有一个索引文件。它应该包括http://www.site.com/winkelwagen/index.php而不是 categorie.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

好的...欢迎使用 Stack Overflow。我首先要说你可以发布链接,试图通过使用“点”来破坏链接实际上更像是垃圾邮件,至少对我来说。

我将继续建议您不要使用您的网站和公开该代码。它有各种安全漏洞,我不打算详细介绍。但是,假设我很好奇为什么您的用户被称为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. !empty($var)与交换isset($var[0]),如果 $var 是一个字符串
  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 我没有解决您遇到的安全问题,因为我认为您使用的代码不应该被使用。考虑使用一个框架或至少从一个框架中学习。路由是好的MVC的基石,你走在正确的道路上,更进一步。

于 2013-01-19T02:40:22.417 回答
0

您能否也对此进行测试并发送您的反馈,我只是重新构建了代码(我使用 if 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 回答