RewriteRule打破了$ _SESSION

时间:2010-09-10 18:31:04

标签: php .htaccess mod-rewrite

在我添加.htaccess文件之前,一切正常。我要做的是将我的所有用户都路由到他们的个人资料页面。 www.darudude.com/user1路由到www.darudude.com/userinfo.php?user=user1

我的.htaccess文件:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\?*$ userinfo.php?user=$1 [L,QSA]

然而,自从我添加这个以来,它打破了我的会话。在每个页面上,我都有一个初始化会话,会话存储引用者。这是处理重要部分的代码片段。

if(isset($_SESSION['url'])){
     $this->referrer = $_SESSION['url'];
}else{
     $this->referrer = "/index.php";
}
//this echo is used to debug why this thing isn't working!!
echo "<script>alert('".$this->referrer."');</script>";
/* Set current url */
$this->url = $_SESSION['url'] = $_SERVER['PHP_SELF'];

然后我使用这段代码返回原始页面:

header("Location: ".$session->referrer);

因此,例如,如果没有.htaccess文件,如果我通过其中一个页面登录一切正常,我会被重定向回我登录的页面(即如果我从index.php登录,我会被重定向回index.php;如果是faq.php,我会被重定向回faq.php)。使用.htaccess文件,我一直被发送到/userinfo.php,这导致我的重写错误

这是它应该如何工作: index.php加载。 $ _SESSION ['url']设置为index.php
如果操作重定向到process.php,则会生成登录表单 process.php $ session-&gt; referrer是从$ _SESSION ['url']设置的 确认登录后,页面应重定向使用:header(“Location:”。$ session-&gt; referrer);

这是它最初没有任何问题的方式。

然而,在.htaccess创建后,它似乎将我重定向到userinfo.php。我认为这与我的规则有关。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我不确定我是否理解了这个问题,但您正在使用的重写规则似乎将请求转为/index.php到请求/userinfo.php?user=/index.php,这可能不是您想要的。

答案 1 :(得分:0)

这是因为你依赖$_SERVER['PHP_SELF'],它不包括查询字符串(URI的?user=部分)。它之前有效,因为您的页面不依赖于查询字符串来唯一标识自己。您可以改为使用$_SERVER['REQUEST_URI'],但要注意您想要要保留的查询字符串并且现在正在保存的情况。

顺便提一下,RewriteRule正则表达式中的\?*与其中的{{1}}完全相同,就好像它不存在一样。

答案 2 :(得分:0)

您可以尝试使用AJAX登录,因此根本不必刷新页面。一个简单的谷歌搜索将产生大量的结果,见下文。即使你没有使用jQuery(很多教程似乎都期望你),它仍然可以使用基本的Javascript,事实上,这是我在将其转换为稍后使用jQuery之前编写AJAX登录脚本的方式。

http://www.google.com/search?q=php+ajax+log-in