【问题标题】:php $_SERVER['PHP_SELF'] to include query stringphp $_SERVER['PHP_SELF'] 包含查询字符串
【发布时间】:2013-11-21 16:52:56
【问题描述】:

我实际上是在尝试创建一个登录系统,让用户返回他们所在的页面。我知道有人问过这个问题,并且我查看了关于 SO 的其他答案,但我找不到针对我的特定问题的解决方案。

我的网站有一个带有参考 ID 号的表格(例如:10001、10003、10004、... 53401 等)。这些数字也是链接。所有链接都指向一个页面(“mypage.php”),并且参考 id 号(10004)成为该 url 的查询字符串:

<td><?php echo '<a href="mypage.php?query_ecr=', urlencode($num), '">'; ?><?php echo $num; ?></a></td>

在网站每个页面上的“header.php”上,菜单上有一个按钮,可以打开下面的表单供用户登录。

<form action='login/process.php' method='post'>
  <label for='name'>Username:</label>
  <input type='text' id='userid' name='user_name'/>
  <label for='password'>Password:</label>
  <input type='password'  name='password' id='userpassword'/>

  <input type='submit' value='Log In' />

  <input type='hidden' name='login' value='1'>
  <input type='hidden' value='".$_SERVER['PHP_SELF']."' name='redirurl'/>
</form>

注意名称='redirurl'的“隐藏输入”。我想捕获用户所在的当前页面。我已经有一个登录脚本,它将检查用户名和密码并将它们重定向到他们需要的页面。

//login/process.php

...blah blah blah other stuff...

global $database,$session;
       $this->user_status=$database->CheckUserPass($_POST['user_name'],$_POST['password']);
       $url = $_POST['redirurl'];
       if($this->user_status==1)
          {
              $session->StartSession($_POST['user_name'],$_POST['password']);
              header("Location: ".$url);
        } else {
              ...blah blah blah.....
              }

我的问题是,如果 GUEST 点击一个链接(例如:10004),他们会被带到 url:

http://www.XXXXXX.XXXX/mypage.php?query_ecr='10004'

但是,在该页面上,“redirurl”的值为:

http://www.XXXXXX.XXXX/mypage.php

它忽略查询字符串。因此,当用户从该页面登录,并且我的登录脚本将他们重定向回该页面时,该页面会出现大量错误,因为它需要查询字符串。

如何在 $_SERVER['PHP_SELF'] 中包含查询字符串?

【问题讨论】:

    标签: php redirect login


    【解决方案1】:

    你可以使用:

    $_SERVER['REQUEST_URI']
    

    获取域名文件夹、查询字符串等之后的所有内容。 然后,您可以使用其他 $_SERVER 变量来添加域,或者如果您不更改主机,也可以不使用域名。

    【讨论】:

    • 谢谢大家。你们都有有效的解决方案,但这种方法效果最好,因为并非我的所有页面都有查询字符串
    【解决方案2】:

    怎么样:

    echo $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'];
    

    请注意,您可能希望像这样清理该输出:

    $url = $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'];
    echo htmlspecialchars($url, ENT_QUOTES, 'utf-8');
    

    防范 XSS。

    【讨论】:

      【解决方案3】:

      查询字符串在$_SERVER['QUERY_STRING'] 中可用。只需连接它们(不要忘记问号),你会没事的。 :)

      【讨论】:

        【解决方案4】:

        年份:2020

        如果你们中的任何人仍在寻找答案,那么就是这里。

        假设这是您的网址:

        www.example.com/foobar/foo/bar.php?id=23
        

        这里是选项。第一个返回域之后的所有内容,第二个返回当前页面及其查询。

        echo $_SERVER['REQUEST_URI'];
        echo $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'];
        // /foobar/foo/har.php?id=23
        
        
        echo pathinfo( $_SERVER['PHP_SELF'], PATHINFO_BASENAME ). '?' . $_SERVER['QUERY_STRING'];
        // bar.php?id=23
        

        【讨论】:

          猜你喜欢
          • 2019-07-03
          • 1970-01-01
          • 2011-05-14
          • 1970-01-01
          • 1970-01-01
          • 2011-02-05
          • 2011-03-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多