我一直在尝试让它正常工作,但我在执行时获得了无限重定向。我过去做过这个,但是不记得我是怎么做到的(很久以前我就丢失了我原来的文件)。
我设置了一个年龄门,只允许18岁以上的人访问内容。如果他们来到我的首页(index.php),他们将被要求输入他们的生日(mm-dd-yyyy),如果他们符合年龄,他们将被带到下一页(home.php)。如果他们不是年龄,那么他们应该直接到“抱歉”页面(message.php)。并且,如果由于某种原因,他们直接进入home.php,他们需要被重定向到index.php才能进入他们的生日。
所以流程: index.php - home.php(如果他们通过年龄门)
指数。 php - message.php(如果他们不这样做)
home.php - index.php(如果他们尚未通过年龄门)
home.php - message.php(如果他们已经通过年龄门,但检查失败,并试图查看他们是否可以直接访问该页面)
(额外)file.php - index.php - file.php(如果他们没有通过年龄门,被重定向到索引这样做,然后在他们通过后被带回file.php /选中)
现在,我在home.php上获得了一个无限循环(重定向太多)
我的代码如下:
的index.php
<?php
session_start();
if ( isset( $_SESSION[ 'legal' ] ) ) { # Check to see if session has already been set
$url = ( $_SESSION[ 'legal' ] == 'yes' ) ? 'home.php' : 'message.php';
header( 'Location: ' . $url );
}
// If visitor hasn't gone through the age gate - Age Gate function and Set Session//
if ( isset( $_POST[ 'checkage' ] ) ) {
$day = ctype_digit( $_POST[ 'day' ] ) ? $_POST[ 'day' ] : '';
$month = ctype_digit( $_POST[ 'month' ] ) ? $_POST[ 'month' ] : '';
$year = ctype_digit( $_POST[ 'year' ] ) ? $_POST[ 'year' ] : '';
$birthstamp = mktime( 0, 0, 0, $month, $day, $year );
$diff = time() - $birthstamp;
$age_years = floor( $diff / 31556926 );
if ( $age_years >= 18 ) {
$_SESSION[ 'legal' ] = 'yes';
$url = 'index.php';
} else {
$_SESSION[ 'legal' ] = 'no';
// If failed the Age Gate go to specific page
$url = 'message.php';
}
header( 'Location: ' . $url );
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Check</title>
</head>
<body>
<form method="post" action="index.php" id="checkage">
<label for="Month">Month:</label>
<input type="text" name="month" id="month"/>
<label for="Day">Day:</label>
<input type="text" name="day" id="day"/>
<label for="Year">Year:</label>
<input type="text" name="year" id="year"/>
<input type="submit" name="checkage" value="Submit" class="submit-button"/>
</form>
</body>
</html>
home.php
<?php
if (!isset($_SESSION['legal']) || $_SESSION['legal'] == 'no') {
$_SESSION['target'] = $_SERVER['PHP_SELF'];
header('Location: index.php');
return;
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Home</title>
</head>
<body>
<p>you are here</p>
</body>
</html>
message.php
<html>
<head>
<meta charset="utf-8">
<title>Sorry</title>
</head>
<body>
<p>sorry you are not able to see this content</p>
</body>
</html>
不幸的是,我没有外部服务器来测试(或链接到)
答案 0 :(得分:1)
我已经重写了很多你所拥有的内容,并将功能整合到一个check-age.php
包含中。
// includes/check-age.php
<?php
session_start();
function isLegalAge()
{
return ! empty($_SESSION['is_legal']);
}
function hasCheckedLegalAge()
{
return isset($_SESSION['is_legal']);
}
function validateLegalAge()
{
$day = $_POST['day'] ?? null;
$month = $_POST['month'] ?? null;
$year = $_POST['year'] ?? null;
$dob = new DateTime("{$year}-{$month}-{$day}");
$age = $dob->diff(new DateTime);
$_SESSION['is_legal'] = $age->y >= 18;
redirect();
}
function redirect()
{
$validUrl = $_SESSION['redirect_url'] ?? 'home.php';
$url = isLegalAge() ? $validUrl : 'message.php';
unset($_SESSION['redirect_url']);
header("Location: {$url}");
exit();
}
function forceLegalAgeCheck($redirectUrl = null)
{
$_SESSION['redirect_url'] = $redirectUrl;
header('Location: index.php');
exit();
}
如果您将check-age.php
文件包含在其他文件(home.php
,file.php
)的顶部,则可以将逻辑简化为以下内容。
// index.php
<?php
require_once('includes/check-age.php');
// Redirect user if they have already confirmed age
if (hasCheckedLegalAge()) redirect();
// Validate user submitted age and redirect accordingly
if ($_POST) validateLegalAge();
// HTML ...
// home.php
<?php
require_once('includes/check-age.php');
// Check if user is of legal age, or force legal age check and return to this page
if (! isLegalAge()) forceLegalAgeCheck();
// HTML ...
// file.php
<?php
require_once('includes/check-age.php');
// Check if user is of legal age, or force legal age check and return to this page
if (! isLegalAge()) forceLegalAgeCheck(__FILE__);
// HTML ...
这是未经测试的,但我认为它应该有效,或者至少可以让您知道如何继续。
编辑 - 我做了一些修改以满足您的新要求。
hasCheckedLegalAge()
函数。isLegalAge()
替换了index.php
中的hasCheckedLegalAge()
来电。我认为这应该达到你所需要的,但如果没有,它肯定会让你再次指向正确的方向。