Php “我无法解决”;重定向循环“;

Php “我无法解决”;重定向循环“;,php,redirect,Php,Redirect,此网页具有重定向循环。 以上内容已经在这里进行了广泛的讨论和回答,但是在遵循这里的建议之后,我仍然无法解决“header”(“Location:…)”的问题 该代码在用户单击电子邮件中的“忘记密码”链接时执行。该链接附带随机字符串,如“../trs=randomstringstoredindatabase” 执行代码时: 如果字符串有效,我将得到以下结果: Case with code lines "header...;: & "exit;" uncommented: URL i

此网页具有重定向循环。 以上内容已经在这里进行了广泛的讨论和回答,但是在遵循这里的建议之后,我仍然无法解决“header”(“Location:…)”的问题

该代码在用户单击电子邮件中的“忘记密码”链接时执行。该链接附带随机字符串,如“../trs=randomstringstoredindatabase”

执行代码时:

如果字符串有效,我将得到以下结果:

Case with code lines "header...;: & "exit;" uncommented:
    URL in browser: http://localhost/pl_00_00/pl_process_forgot_password_back.php/pl_reset_password.php/index.php
    Chrome displays: This webpage has a redirect loop

Case with code lines "header...;: & "exit;" commented out:
    URL in browser: http://localhost/pl_00_00/pl_process_forgot_password_back.php/?trs=015df6fcf5bdcd4d9a339d5ca79d27a7 - correct
    Chrome displays echo: "Redirect to: pl_reset_password.php/?memid=11" - as expected
否则(字符串无效):

因此,当不使用“header()”函数时,逻辑似乎是正确的。只要我取消注释“header()”和“exit”并注释掉echos和var_dumps,问题就会出现,重定向就不会发生。下面是我使用的代码(PASSWORD_RESET_PAGE和HOME_PAGE是别处定义的常量,它们都没有函数“header”(“Location…”)“这可能会导致它们中的重定向循环):


请记住,
die
exit
是等效的,所以选择一个。 在脚本中点击
die
exit
后,脚本将不会继续执行。正因为如此,您正在切断echo语句和var_转储,如果您希望看到它们,它们应该在标题之前,但重定向可以非常快,这意味着它们可能根本看不到

如果您重定向到当前所在的同一页面,或者在后续页面上继续重定向用户,则可能会发生重定向循环。如果您确定情况并非如此,则需要删除与您的站点关联的所有cookie和浏览器缓存,这将解决问题

下面是示例,请按正确的顺序放置代码

<?php 
# pl_process_forgot_password_back.php
require_once ("lib/required.php");

    # $_GET the string from url check and if matches, active and not expired display password change form
    $trs_from_email = $_GET['trs'];
    # retrieve user data    
    $query = "SELECT * FROM tbl_member WHERE temporary_random_string    = '" . $trs_from_email . "'";

        $data_retrieved = sql_get_results_array($query); # retrieve data
        if (db_affected_rows() == 1) { # string matched - 1 row selected
            if ($data_retrieved[0]['random_string_active']){ # string active
                if ($data_retrieved[0]['random_string_expiry'] > time()){ # string not expired
                    # all ok - display reset password form                      

                    echo '<br>' . '# all ok - display reset password form';
                    echo '<br>' . 'Redirect to: ' . PASSWORD_RESET_PAGE . '/?memid=' . $data_retrieved[0]['id'];
                    var_dump($_SESSION);
                    var_dump($data_retrieved);

                    header ( "Location: " . PASSWORD_RESET_PAGE . '/?memid=' . $data_retrieved['id'] ); # send them to page with reset-password form
                    exit; 
                } else { # string expired
                    $_SESSION['popup_msg_id'] = 17; # this is to popup request expiry message   
                } # /if string not expired
            } else { # string inactive
                $_SESSION['popup_msg_id'] = 18; # request already processed message 
            } # /if string active
        } else { # string not matched
            $_SESSION['popup_msg_id'] = 19; # string not matched message    
        } # /if valid string found

    echo '<br>' . '# some error';
    echo '<br>' . 'Redirect to: ' . HOME_PAGE;
    var_dump($_SESSION);
    var_dump($data_retrieved);                        

    header ( "Location: " . HOME_PAGE ); # send them to homepage and display popup error
    exit;                    
?>

谢谢。我只使用echos和var_转储进行测试,不希望在header(“Location..和exit打开时看到它们。С请详细说明Cookie和cache…我每次调用header()时是否需要清除Cookie功能?顺便说一句,我已经删除了与本地主机相关的cookie并清除了浏览历史记录,这并没有改变结果。@Voytek您在其他浏览器中得到了相同的结果吗?是的,Firefox的抱怨与Chrome不同,但具有相同的含义,而IE建议无效…我只是不明白这些URL在redi之后是如何格式化的rect,seemas-like-concatenation。我想我应该添加以下信息:我的项目中的所有页面都是.php。虽然这个特定页面是纯php的,但带有html的页面确实遵循jquery-mobile原则。然而,它们目前是“单页”的,也就是说,它们不包含jq-mobile的多页概念。
<?php 
# pl_process_forgot_password_back.php
require_once ("lib/required.php");

    # $_GET the string from url check and if matches, active and not expired display password change form
    $trs_from_email = $_GET['trs'];
    # retrieve user data    
    $query = "SELECT * FROM tbl_member WHERE temporary_random_string    = '" . $trs_from_email . "'";

        $data_retrieved = sql_get_results_array($query); # retrieve data
        if (db_affected_rows() == 1) { # string matched - 1 row selected
            if ($data_retrieved[0]['random_string_active']){ # string active
                if ($data_retrieved[0]['random_string_expiry'] > time()){ # string not expired
                    # all ok - display reset password form                      
                    header ( "Location: " . PASSWORD_RESET_PAGE . '/?memid=' . $data_retrieved['id'] ); # send them to page with reset-password form
                    exit;   

echo '<br>' . '# all ok - display reset password form';
echo '<br>' . 'Redirect to: ' . PASSWORD_RESET_PAGE . '/?memid=' . $data_retrieved[0]['id'];
var_dump($_SESSION);
var_dump($data_retrieved);
die;                        
                } else { # string expired
                    $_SESSION['popup_msg_id'] = 17; # this is to popup request expiry message   
                } # /if string not expired
            } else { # string inactive
                $_SESSION['popup_msg_id'] = 18; # request already processed message 
            } # /if string active
        } else { # string not matched
            $_SESSION['popup_msg_id'] = 19; # string not matched message    
        } # /if valid string found

    header ( "Location: " . HOME_PAGE ); # send them to homepage and display popup error
    exit;

echo '<br>' . '# some error';
echo '<br>' . 'Redirect to: ' . HOME_PAGE;
var_dump($_SESSION);
var_dump($data_retrieved);                      
die;                        
?>
<?php 
# pl_process_forgot_password_back.php
require_once ("lib/required.php");

    # $_GET the string from url check and if matches, active and not expired display password change form
    $trs_from_email = $_GET['trs'];
    # retrieve user data    
    $query = "SELECT * FROM tbl_member WHERE temporary_random_string    = '" . $trs_from_email . "'";

        $data_retrieved = sql_get_results_array($query); # retrieve data
        if (db_affected_rows() == 1) { # string matched - 1 row selected
            if ($data_retrieved[0]['random_string_active']){ # string active
                if ($data_retrieved[0]['random_string_expiry'] > time()){ # string not expired
                    # all ok - display reset password form                      

                    echo '<br>' . '# all ok - display reset password form';
                    echo '<br>' . 'Redirect to: ' . PASSWORD_RESET_PAGE . '/?memid=' . $data_retrieved[0]['id'];
                    var_dump($_SESSION);
                    var_dump($data_retrieved);

                    header ( "Location: " . PASSWORD_RESET_PAGE . '/?memid=' . $data_retrieved['id'] ); # send them to page with reset-password form
                    exit; 
                } else { # string expired
                    $_SESSION['popup_msg_id'] = 17; # this is to popup request expiry message   
                } # /if string not expired
            } else { # string inactive
                $_SESSION['popup_msg_id'] = 18; # request already processed message 
            } # /if string active
        } else { # string not matched
            $_SESSION['popup_msg_id'] = 19; # string not matched message    
        } # /if valid string found

    echo '<br>' . '# some error';
    echo '<br>' . 'Redirect to: ' . HOME_PAGE;
    var_dump($_SESSION);
    var_dump($data_retrieved);                        

    header ( "Location: " . HOME_PAGE ); # send them to homepage and display popup error
    exit;                    
?>