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

sur*_*fel 1 php http-referer redirect

假设我有两页page1.php,page2.php并且我只想page2.php在它是重定向表单时显示page1.php并且我将此代码插入到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 
}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常,直到我有一个表单和一个提交按钮,page2.php当点击提交按钮时页面刷新,这意味着HTTP_REFERER将更改为page2.php所以我if statement失败了,它让我回到page1.php我不希望这种情况发生。有什么办法可以防止这种情况发生吗?

提前致谢。

Pet*_*jda 11

我不建议使用HTTP_REFERER:

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

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

  3. 它无法通过HTTPS.

  4. 一些代理从请求中去除这个标头

  5. 添加 - 请参阅此问题的答案


正如 Charlotte Dunois 在评论中所说,最好在发送表单之前设置会话值,然后在第 2 页上进行检查。

page1.php:

$_SESSION[ 'display_page2' ] = TRUE;
//rest of the content
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 仍然可以通过 HTTPS 访问引用站点。 (2认同)