【问题标题】:Is it possible to redirect on die() using PHP?是否可以使用 PHP 在 die() 上重定向?
【发布时间】:2019-01-21 14:52:49
【问题描述】:

我正在尝试将 die() 上的用户重定向到不同的地方。例如,如果用户点击取消,他将被重定向到 tryagain.php,或者如果他输入错误的凭据,他将被重定向到 resetpassword.php

请指导我,以便我能够实现这一目标。

我如何做到这一点。下面是我的代码:

<?php
$realm = 'Restricted area';

//user => password
$users = array('admin' => 'mypass', 'guest' => 'guest');


if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Digest realm="'.$realm.
           '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');

    die('Text to send if user hits Cancel button');
}


// analyze the PHP_AUTH_DIGEST variable
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
    !isset($users[$data['username']]))
    die('Wrong Credentials!');


// generate the valid response
$A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);

if ($data['response'] != $valid_response)
    die('Wrong Credentials!');

// ok, valid username & password
echo 'You are logged in as: ' . $data['username'];


// function to parse the http auth header
function http_digest_parse($txt)
{
    // protect against missing data
    $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
    $data = array();
    $keys = implode('|', array_keys($needed_parts));

    preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);

    foreach ($matches as $m) {
        $data[$m[1]] = $m[3] ? $m[3] : $m[4];
        unset($needed_parts[$m[1]]);
    }

    return $needed_parts ? false : $data;
}
?>

【问题讨论】:

  • 我不确定这是最好的方法。如果他们点击“取消”,你为什么要为他们提供一个页面来“再试一次”?取消肯定不想再试一次?如果凭据错误,请告诉他们并让他们再次输入数据。不要重定向到重置密码,这应该只是一个链接和他们点击它的选择。只是我的意见,虽然如果你使用 KISS 也是别人的en.wikipedia.org/wiki/KISS_principle
  • 一些很容易测试的东西。
  • ?&gt; 是什么,我不再使用这些了。应该注意的是,在调用 header 之前进行标头重定向任何输出都会阻止它工作,包括上一页上的 \s&lt;?php?&gt; 你看到 php 标签之前的空格(它不允许你放空格in 在行内代码的反引号之后),从技术上讲,它是在结束标记之后的行返回。

标签: php redirect die


【解决方案1】:

你可以这样做

die("<script>window.location = 'https://www.example.com/tryagain.php';</script>");

header("Location: http://example.com/tryagain.php");
die();

【讨论】:

  • die(); 真的会发生吗?看起来页面会在到达 die 语句之前重定向。
  • 您的脚本将在处理重定向时继续。最佳做法是在重定向后放置 die(),以确保在处理重定向时没有运行其他代码。
  • 它运行良好。但是,输入错误的凭据会产生一个小问题。如果用户点击返回按钮再次登录,它会立即重定向回 forgetpassword.php
  • 如果您想避免这个问题,您可能需要更改登录过程以异步执行,我认为没有简单的方法可以避免这种情况。
  • @RickCresci 这与这个问题不同。您需要处理如何执行此操作。登录失败应该总是再次显示登录页面。在一个不允许我解决问题并让我点击“返回”的页面上被告知“错误”有点烦人。此外,与其重定向,不如在同一页面上显示一条错误消息,以便它们仍在登录表单页面上。
【解决方案2】:

随便用

header('Location: tryagain.php');

在您的if 声明中,然后致电die

引用this answer:

如果您没有在 header('Location: http://something') 之后放置 die() 或 exit(),您的脚本可能会继续导致意外行为。例如,这可能会导致您实际上希望通过重定向 (HTTP 301) 阻止的内容被泄露。最终用户可能无法直接看到上述内容,因为浏览器可能无法呈现它(由于 301)。结论,exit() 和 die() 函数阻止脚本继续运行。

【讨论】:

    【解决方案3】:

    PHP 有一个预定义的方法 header('Location: tryagain.php'); 只需将 die 语句替换为上述语句即可。 您不需要使用 die 因为您是有条件的,因此您可以轻松地将您的用户重定向到 try again.php 如果他插入错误的详细信息 您可以在 Google 上对其进行更多研究

    【讨论】:

    • 这将在开始时重定向整个页面!
    • 那么请编辑您的问题并添加更多信息您想要做什么
    • 我正在尝试在 die() 上重定向用户。这意味着如果他输入了错误的密码或取消了登录屏幕,他将被重定向到另一个页面,在那里他将尝试再次登录或重置密码。
    • 我不认为瑞克是这样的。在 die 上重定向并使用 header + die 在功能上达到相同的结果。这是假设 tryagain 是一个独立的网页,而不是被包括在内
    猜你喜欢
    • 2013-07-10
    • 1970-01-01
    • 2016-07-18
    • 2011-10-11
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 2022-01-11
    • 2017-11-08
    相关资源
    最近更新 更多