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