是否可以从提交的URL中获取查询字符串,将其存储在会话变量中,然后在启动php之前重定向到另一个php页面?
我正在寻找.htaccess(Mod-rewrite)的解决方案。
用户输入网址/home.php?id=fred
然后在.htaccess中,id = fred被剥离并放入$ _SESSION ['id'] ='fred'
和之前发送到/index.php
我曾尝试在PHP中使用以下内容,但这似乎失败了
<?php
$qs = $_SERVER['QUERY_STRING'];
parse_str($qs, $gets);
// there are reasons for not just moving the $_GET values direct to $_SESSION
sanitise_gets($gets); // filters the values for valid values into $_SESSION
// redirect user to real 'home' page
$url = 'http://'.$_SERVER['SERVER_NAME'].'/index.php';
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Location: ".$url,true,303);
exit();
function sanitise_gets((array) $gets) {
...
}
?>
另一个问题是PHP内的重定向似乎只显示index.php /?id = fred! 用户永远不可能收藏书签或返回home.php
我想这个问题真的归结为:
你能写一下.htacces中的会话cookie吗?
答案 0 :(得分:0)
去秃头后!
我想我有一个解决方法 - 从来没有完美,但做了我需要的 - 从地址栏中消除了这个查询字符串!
home.php (新的和简单的)
<?php
session_start();
if (isset($_SESSION['q_s'])) { unset($_SESSION['q_s']); }
if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) {
$_SESSION['q_s'] = $_SERVER['QUERY_STRING'];
}
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header('Location: index.php?',true,301);
?>
重要的一点似乎是要防止缓存,而且&#39;?&#39;在重定向url中的index.php之后。关键是要在会话中存储查询字符串,所以我们必须记住启动会话!
.htaccess (现在变成)
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} .
RewriteRule index.php(.*) /index.php? [L,R=301]
显然所有对index.php的调用都必须使用POST数据而且从不GET数据所以所有对涉及链接的站点上的索引的引用都需要替换(在我们的例子中没有)与home.php?无论什么
$ _SESSION [&#39; q_s&#39;]可以通常的方式在index.php中处理。
使用浏览器插件将POST转换为GET的用户将被视为滥用网站,并将留下vanilla索引页面,因为他们的查询字符串将丢失。
为了清楚起见,我没有使用sanitise_gets()函数,但在使用之前清理QUERY_STRING很重要,甚至可能在将它保存到会话之前。