如何在PHP中正确使用$ _SERVER [' HTTP_REFERER']?

时间:2016-03-26 19:52:29

标签: php redirect http-referer

假设我有两个页面page1.phppage2.php,我希望page2.php仅在page1.php重定向时显示,并且我将此代码插入{{ 1}}

page2.php

此代码正常工作,直到我在if($_SERVER['HTTP_REFERER'] == "page1.php") { //keep displaying page2.php }else{ //if it is not redirected from page1.php header('Location:page1.php') //redirect the user back to page1.php } 上有一个表单和提交按钮,当点击提交按钮时页面刷新,这意味着page2.php将更改为HTTP_REFERER所以我{ {1}}失败了,它让我回到page2.php我不希望这种情况发生。有什么办法可以防止这种情况发生吗?

提前致谢。

4 个答案:

答案 0 :(得分:3)

我不建议使用HTTP_REFERER:

  1. 在浏览器中操作相当简单。

  2. 某些用户可能在其浏览器中设置了安全设置,根本不会发送此标题。

  3. 无法通过HTTPS访问。

  4. 某些代理会从请求中删除此标题

  5. 已添加 - 请参阅this quesion的答案

  6. 正如Charlotte Dunois在评论中所述,在发送表格之前更好地设定会话价值,然后在第2页上查看。

    page1.php中:

    $_SESSION[ 'display_page2' ] = TRUE;
    //rest of the content
    

    使page2.php:

    if ( (isset( $_SESSION[ 'display_page2' ] ) && $_SESSION[ 'display_page2' ] === TRUE ) || isset( $_POST[ 'some_form_input' ] ) ) {
      //keep displaying page2.php
    } else {
      header('Location:page1.php');
      exit;
    }
    

    使用isset( $_POST[ 'some_form_input' ] ),您可以检查表单是否已发送(通过POST方法)。

    如果需要,您可以使用unset( $_SESSION[ 'display_page2' ] );取消会话或将其设置为不同的值。

答案 1 :(得分:1)

<?php
if(($_SERVER['HTTP_REFERER'] == "page1.php") || (isset($_POST['submit']) && $_SERVER['HTTP_REFERER']=="page2.php"))
{
    //keep displaying page2.php
}else{
    //if it is not redirected from page1.php
    header('Location:page1.php');
    //redirect the user back to page1.php 
}

?>

如果推荐人不是第1页,您可以检查条件,如果referrer = page2并且提交了帖子。 或检查推荐人是否为第1页或提交帖子。 这是避免你的问题的可能性。

答案 2 :(得分:1)

我建议不要使用$_SERVER['HTTP_REFERER'],因为它很容易被欺骗。

相反,您可以在输出任何标记之前使用setcookie("page1", 1); 加载第1页时设置cookie。然后使用

在第2页上检查它
if(isset($_COOKIE['page1']))
{
    //keep displaying page2.php
}else{
    //if it is not redirected from page1.php
    header('Location:page1.php')
    //redirect the user back to page1.php 
}

如果未指定过期日期,则cookie将在浏览器关闭时过期。在这种情况下,使用cookie还可以为其他人提供更易读的代码。

答案 3 :(得分:0)

<?php

/* 
    this page allows links from the following pages

    public.php?id=links
    private.php?id=links

don't allow if visitors come from anywhere else

this example would only work if I used the entire URL in the 'if' statement 
*/

$referringpage = $_SERVER['HTTP_REFERER'];

if ( $referringpage == "http://www.example.com/public.php?id=links" ) {
$pass = "yes";
} elseif ( $referringpage == "http://www.example.com/private.php?id=links" ) {
$pass = "yes";
} else {
$pass = "no";
}


if ( $pass == "yes" ) {
// do the function this page was made to do
} 

header( "Location: http://www.example.com/public.php?id=links" );

?>