【问题标题】:RewriteRule is breaking $_SESSIONRewriteRule 正在破坏 $_SESSION
【发布时间】:2017-12-06 05:55:38
【问题描述】:

在我添加 .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->referrer 是从 $_SESSION['url']
设置的 确认登录后,页面应重定向使用: header("Location: ".$session->referrer);

这就是它最初的工作方式,没有任何问题。

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

有什么想法吗?

【问题讨论】:

  • 我想看看原来设置$_SESSION['url']的代码
  • 第二个代码块的最后一行

标签: php .htaccess mod-rewrite


【解决方案1】:

我不确定我是否理解问题,但您使用的重写规则似乎会将对/index.php 的请求变成对/userinfo.php?user=/index.php 的请求,这可能不是您想要的。

【讨论】:

  • 是的,这正是我不想要的!你知道怎么做吗?据我了解,2个重写条件仅在文件和目录不存在时强制执行规则。此外,当我在地址栏中输入 index.php 时,它会将我重定向到正确的页面(不是 userinfo.php)
  • 由于 2 RewriteConds,@Pies 不正确,因为文件 index.php 将存在,因此重写规则将不适用,对 /index.php 的请求将正确发送到那里。这只是一个请求,例如/abc(既不存在目录也不存在名为 abc 的文件)将强制执行重写规则。
  • 你确定index.php和userinfo.php在同一个目录吗?尝试从 .htaccess 中删除 RewriteBase \。
  • 这是另一个有趣的条件。我将重写规则更改为 RewriteRule ^~(.*)\?*$ userinfo.php?user=$1 [L,QSA] 并且一切正常。但是,我的用户的 url 将是 www.darudude.com/~user。我还是希望有 www.darudude.com/user
  • 为什么不只是这个? RewriteRule ^(.*)$ userinfo.php?user=$1 [L,QSA]
【解决方案2】:

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

顺便说一句,你的 RewriteRule 正则表达式中的 \?* 所做的事情就像它不存在一样。

【讨论】:

  • 这也不起作用。我没有尝试使用正确的用户访问用户信息页面。我想回到我登录的原始页面,即 index.php
  • 我不明白这是怎么发生的,因为如果你被重定向到 userinfo.php,你将永远被重定向到那里,但没关系。在这种情况下,当您的会话 URL 设置代码发生在 userinfo.php 中时,您需要将 URL 设置为 $_GET['user'] 而不是 $_SERVER[anything]
  • 在创建 .htaccess 文件之前,我从未被重定向到 userinfo.php。这就是它的工作方式:加载 index.php。 $_SESSION['url'] 设置为 index.php。制定了登录表单,其操作重定向到 process.php。 process.php $session->referrer 是从 $_SESSION['url'] 设置的。确认登录后,页面应重定向使用:header("Location: ".$session->referrer);。这就是它最初的工作方式,没有任何问题。但是,在创建 .htaccess 之后,它似乎将我重定向到 userinfo.php。我认为这与我的规则有关。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2021-08-07
    • 2018-01-16
    • 2016-07-02
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    相关资源
    最近更新 更多