0

首先.htaccess,我发送urlpublic/index.php

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ public/index.php [NC,L]

我的public/index.php

<?php
// define root path of the site
if(!defined('ROOT_PATH')){
define('ROOT_PATH','../');
}

require_once ROOT_PATH.'function/my_autoloader.php';

use application\controllers as controllers;

 $uri=strtolower($_SERVER['REQUEST_URI']);
 $actionName='';
 $uriData=array();
 $uriData=preg_split('/[\/\\\]/',$uri );

 $actionName = (!empty($uriData[3])) ? preg_split('/[?].*/', $uriData[3] ): '' ;
 $actionName =$actionName[0];
 $controllerName = (!empty($uriData[2])) ? $uriData[2] : '' ;

 switch ($controllerName) {
case 'manage':
    $controller = new Controllers\manageController($controllerName,$actionName);
    break;
default:
    die('ERROR WE DON\'T HAVE THIS ACTION!');
    exit;
    break;
  }

// function dispatch send url to controller layer 
$controller->dispatch();
?>

我有这个目录:

  • 应用
    • 控制器
    • 楷模
    • 看法
  • 上市
    • css
    • java script
    • 索引.php
  • .htaccess

URL例如,我想要干净localhost/lib/manage/id/1而不是localhost/lib/manage?id=1,我应该怎么做?

4

2 回答 2

1

使用您当前的重写规则,所有内容都已重定向到您的index.php文件。而且,正如您已经在做的那样,您应该解析 URL 以找到所有这些 URL 参数。这称为路由,大多数 PHP 框架都是这样做的。通过一些简单的解析,您可以转换localhost/lib/manage/id/1为数组:

array(
    'controller' => 'manage',
    'id' => 1
)

我们可以简单地做到这一点,首先将 URL 拆分为“/”,然后循环遍历它以查找值:

$output = array();
$url = split('/', $_SERVER['REQUEST_URI']);
// the first part is the controller
$output['controller'] = array_shift($url);

while (count($url) >= 2) {
    // take the next two elements from the array, and put them in the output
    $key = array_shift($url);
    $value = array_shift($url);
    $output[$key] = $value;
}

现在$output数组包含一个 key => value 对,就像你想要的那样。虽然请注意,代码可能不是很安全。这只是为了展示概念,而不是真正的生产就绪代码。

于 2013-01-13T22:54:10.467 回答
0

您可以通过捕获部分 URL 并将其作为查询字符串放置来做到这一点。

RewriteRule /lib/manage/id/([0-9]+) /lib/manage?id=$1 [L]

括号内的字符串将被放入 $1 变量中。如果您有多个(),它们将被放入 2 美元、3 美元等。

于 2013-01-13T18:11:58.437 回答