我有这个规则:
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
第二条规则应该是什么?
你在这里谈论的是不同的东西。你只有你需要的部分代码。
您对已有的规则是正确的-
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 中有一个数值。还有更多(可能更好)的技术可以防止这些事情发生,但这是一个不同的主题,这只是一篇已经很长的帖子末尾的注释。:)