我想让我的php页面只能从另一个页面重定向访问,并阻止我的用户直接访问它。
我的意思是,假设我有一个名为“main.php”的页面和另一个我希望阻止直接访问的PHP文件,名为“noaccess.php”。
我想只有从main.php
重定向才能访问noaccess.php有什么建议吗?
更新:会话是一个好主意,但问题是我必须使用JavaScript来重定向页面,所以问题是,我可以使用ajax来设置PHP会话吗?
更新2:好的我找到了解决方案,我现在不需要阻止直接访问,因为我可以从mysql检查页面是否需要访问。
答案 0 :(得分:7)
如果您每次要重定向,都会在$ _SESSION变量中保存一个值。你有
//code
$_SESSION['fromMain'] = "true";
header("Location: noaccess.php");
然后在noaccess.php中放
if($_SESSION['fromMain'] == "false"){
//send them back
header("Location: foo.php");
}
else{
//reset the variable
$_SESSION['fromMain'] = "false";
}
我真的不知道这是否会起作用,但这就是我会想到的。
答案 1 :(得分:4)
试试这个
if (!isset($_SERVER['HTTP_REFERER'])){
echo "uh?"; }
else {
// The script
}
答案 2 :(得分:3)
我认为你可能从错误的方向解决问题,但如果你真的想实现这个问题,我很可能会用session variable来做。只需让main.php
设置一个标记,表明他们现在可以访问noaccess.php
然后重定向到那里。 noaccess.php
检查标志,只有在设置好后才起作用。
答案 3 :(得分:1)
要阻止访问网页,最佳做法是使用会话变量说$_SESSION['username']
和$_SESSION['password']
来检查数据库表记录,假设您的表名为“users”,字段'用户名'和'密码',以便用户可以访问该页面,否则会将其重定向到登录页面,以便他们提供通过输入字段更正用户名和密码。
以下是防止直接访问PHP页面的解剖结构。
session_start();
$username=$_POST['username'];
$password=$_POST['password'];
$query="select * from users where username='$_SESSION[username]' and password='$_SESSION[password]'";
$result=mysql_query($query);
if($result)
{
echo "Your login was successful..";// the page you want to go to if login successful
{
else
{
header("Location:index.php?action=login");//any page you want to return to if log in failed
}
答案 4 :(得分:1)
我知道这已经得到回答。尽管答案是好的,但我正面临着同样的情况,所以我想我会投入两点。
我不会使用HTTP_REFERER,这并不可靠,并不是每个浏览器都显示它。
我不会使用会话变量,因为它是有状态的,您将不得不编写更多代码行以对每个请求进行检查,从而导致不必要的膨胀。
理想情况下,我将创建一个具有两个主功能且无访问权限的控制器类
或者,如果您不想遇到麻烦,我将创建一个变量,该变量可以在noccess.php中全局访问,并带有简单的true false。
这就是我要做的:
class Access{
protected $access = false;
public function main(){
//Authenticate and set
include_once 'main.php';
$this->access = true;
}
public function no access(){
if($this->access === true){
include_once 'no access'.php;
}else{
header('location: main.php');
}
}
}
或者如果您不想遇到麻烦,可以创建一个简单的函数或设置一个简单的变量,该变量可以从noaccess.php访问:
//main.php
$access = false;
header('location: noaccess.php');
//noaccess.php
include 'main.php';
if($access){
//Continue
}else{
header('location: main.php');
}
我确定您可以简化此操作,但这将是最简单,最安全的方法,而不是依赖于服务器变量。 我不会使用$ _SESSION或$ _POST,因为这意味着当您想要做的只是安全访问时,不必要地张贴表单
答案 5 :(得分:0)
您可以使用$ _SERVER [“HTTP_REFERER”]。将以下代码放在php文件的开头,并将$ url设置为等于所需的URL,例如http://a.com/main.php
if ($_SERVER['HTTP_REFERER'] != $url) {
header('Location: noaccess.php');
exit();
}
答案 6 :(得分:0)
为什么不只是include
而不是重定向?
答案 7 :(得分:0)
其他人是正确的有$ _SERVER [“HTTP_REFERER”]的问题所以我想最好的方法是将变量设置为$ _SESSION或$ _POST,你需要检查该变量是否存在,如果不是,则意味着它是直接访问。
答案 8 :(得分:0)
你试过这个Iva。以下是有效的代码:
$url != 'your-url-which-you-do-not-what-direct access';
if ($_SERVER['HTTP_REFERER'] == $url) {
header('Location: otherurl.php'); //redirect to some other page
exit();
}
确保它显示在您不希望直接访问的页面顶部。
答案 9 :(得分:0)
我想我回答这个问题晚了,但我的方式是
<?php
$page = basename($_SERVER['PHP_SELF']);//gets current URL
if ($page == "nonaccesspage.php") //any page u don't want to be accessed directly
header('Location:index.php');
else if($page == nonaccesspage2.php") //page 2 which is not accessible
header('Location:index.php');
?>
如果你想授权用户访问页面(我的意思是有一个页面不包含但可以通过 URL 访问)只需使用 $_POST 或 $SESSION 来授权用户使用 ID 和密码或其他东西就这样。