0

我有这个规则: RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

当我发送 GET 表单时,它不起作用。例如http://192.168.1.100/site/admin/analytics/chart?view=daily应该是http://192.168.1.100/site/admin/analytics/chart/view/daily

第二条规则应该是什么?

4

1 回答 1

0

你在这里谈论的是不同的东西。你只有你需要的部分代码。

您对已有的规则是正确的-

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

此规则将“捕获”任何传入请求并将域名之后的所有内容index.php作为$_GET参数传递 - ?url=$1。这$1是您在正则表达式中捕获的内容^(.+)$- 括号之间的所有内容都被捕获。所以到目前为止你还好...

下一个难题是您在index.php其中接收原始 URL 作为 GET 参数的内容。您必须解析参数才能知道要返回给用户的页面。

让我们以这样的事情为例 -

http://yourdomain.com/user/123

你在里面index.php会做的是这样的——

$originalURL = $_GET['url'];
$URLParts = explode('/',$originalURL);

现在你有$URLParts

Array (
 'user',
 '123'
)

从这里您决定如何将数据准确地输出给用户 - 但为了清楚起见,我将举一个粗略的例子 -

// Get base module - array_pop() also removes it from the array 
$baseModule = array_pop($URLParts); 
$requestData = $URLParts; // Collect all other data that was passed
switch($baseModule){
  case "user":
    // If we know the request is for a user page, we know the next URL part
    // will be the user id.  Use it to fetch user information from our database.
    $userID = $requestData[0]
    $user = getUserByID($userID);
    echo $user['name'] . "<br/>";
    echo "<img src='". $user['picture'] ."' width='300' >";
    break;
  case "picture":
    echo "<img src='http://i.imgur.com/s5cH9.png' width='300' >";
    break;
  case "video":
    echo "<a href='http://youtu.be/Xk_XaJ7gE4Q' target='_blank' >Video Link</a>";
    break;
  default:
    echo "404 - The page you requested was not found.";
    break;
}
exit();

使用此代码,您的系统将确切知道当请求进入时该怎么做 -

  • http://yourdomain.com/user/123
  • http://yourdomain.com/picture
  • http://yourdomain.com/video

即使你给它一些垃圾 URL,它也会给你一个保守的信息,即你​​请求的页面没有找到。


这里要注意的一件事是,在使用传入数据时应始终小心。一些恶意脚本可能会发出请求,试图在您的系统中找到安全漏洞。您应该将所有传入数据(例如 中的任何内容$_GET)视为潜在威胁。你需要确保你知道你手中有什么数据。

一个实际的例子是使用在 SQL 查询中发送给我们的 user_id。我们知道我们是通过他们的 ID 来查找用户的,所以我们拥有的数据必须是 numeric。您可以通过调用来验证这一点.intval()- 这将确保您的 SQL 中有一个数值。还有更多(可能更好)的技术可以防止这些事情发生,但这是一个不同的主题,这只是一篇已经很长的帖子末尾的注释。:)

于 2012-05-09T18:41:00.110 回答