如何在PHP中进行重定向?

是否可以通过使用PHP将用户重定向到不同的页面?

假设用户转到www.example.com/page.php,我想将他们重定向到www.example.com/index.php,如果不使用元刷新,我该如何做到这一点?有可能吗?

这甚至可以保护我的页面免受未经授权的用户。

3529263 次浏览

使用#0函数发送HTTP#1标头

header('Location: '.$newURL);

与某些人的想法相反,die()与重定向无关。如果您想重定向正常执行的而是,请使用它只有

文件example.php

<?phpheader('Location: static.html');$fh = fopen('/tmp/track.txt', 'a');fwrite($fh, $_SERVER['REMOTE_ADDR'] . ' ' . date('c') . "\n");fclose($fh);?>

三次处决的结果:

bart@hal9k:~> cat /tmp/track.txt127.0.0.1 2009-04-21T09:50:02+02:00127.0.0.1 2009-04-21T09:50:05+02:00127.0.0.1 2009-04-21T09:50:08+02:00

恢复-强制性的die()/exit()是一些与实际PHP无关的都市传说。它与客户端“尊重”Location:标头无关。发送标头不会停止PHP执行,无论使用的客户端如何。

header( 'Location: http://www.yoursite.com/new_page.html' );

function Redirect($url, $permanent = false){if (headers_sent() === false){header('Location: ' . $url, true, ($permanent === true) ? 301 : 302);}
exit();}
Redirect('http://www.google.com/', false);

别忘了die()/exit()

现有答案的总结加上我自己的两分钱:

1.基本答案

您可以使用header()函数发送新的HTTP标头,但必须在任何超文本标记语言或文本之前将其发送到浏览器(例如,在<!DOCTYPE ...>声明之前)。

header('Location: '.$newURL);

2.重要细节

die()退出

header("Location: https://example.com/myOtherPage.php");die();

为什么你应该使用die()exit()每日WTF

绝对或相对URL

自2014年6月以来,可以使用绝对和相对URL。请参阅rfc7231,它取代了旧的rfc2616,其中只允许绝对URL。

状态码

PHP的“位置”-标头仍然使用HTTP302重定向代码,这是一个“临时”重定向,可能不是您应该使用的重定向。您应该考虑301(永久重定向)或303(其他)。

注意:w3c提到表示303标头与“许多pre-HTTP/1.1用户代理不兼容。目前使用的浏览器都是HTTP/1.1用户代理。这对许多其他用户代理(如蜘蛛和机器人)来说并不是真的。

3.文件

HTTP标头和PHP中的header()函数

4.替代办法

您可以使用http_redirect($url);的替代方法,该方法需要安装PECL封装PECL

5.助手功能

此函数不包含303状态代码:

function Redirect($url, $permanent = false){header('Location: ' . $url, true, $permanent ? 301 : 302);
exit();}
Redirect('https://example.com/', false);

这样更灵活:

function redirect($url, $statusCode = 303){header('Location: ' . $url, true, $statusCode);die();}

6.变通办法

如前所述header()仅在写出任何内容之前重定向工作。如果在超文本标记语言中调用输出,它们通常会失败。然后您可以使用超文本标记语言头解决方法(不是很专业!),例如:

 <meta http-equiv="refresh" content="0;url=finalpage.html">

甚至是JavaScript重定向。

window.location.replace("https://example.com/");

就像这里的其他人所说的,发送位置标头:

header( "Location: http://www.mywebsite.com/otherpage.php" );

但是您需要在将任何其他输出发送到浏览器之前执行此操作。

此外,如果您要使用它来阻止来自某些页面的未经身份验证的用户,就像您提到的那样,请记住,一些用户代理会忽略这并继续在当前页面上运行,因此您需要在发送后使用die()。

这些答案中的大多数都忘记了非常重要的一步!

header("Location: myOtherPage.php");die();

将重要的第二行留出可能会看到您最终进入每日WTF。问题是浏览器不会尊重您的页面返回的标头,因此忽略标头,页面的其余部分将在没有重定向的情况下执行。

在语义网的前夜,正确性是需要考虑的事情。不幸的是,PHP的“位置”-标头仍然使用HTTP302-重定向代码,严格来说,这不是重定向的最佳代码。它应该使用的是303

W3C对提到很好,303标头与“许多pre-HTTP/1.1用户代理”不兼容,这相当于当前没有浏览器使用。所以,302是一个遗物,不应该被使用。

…或者你可以忽略它,就像其他人一样…

我已经回答了这个问题,但我会再做一次,因为与此同时,我了解到,如果您在CLI中运行(重定向不能发生,因此不应该exit()),或者如果您的网络服务器作为(F)CGI运行PHP(它需要先前设置的Status标头才能正确重定向),则存在特殊情况。

function Redirect($url, $code = 302){if (strncmp('cli', PHP_SAPI, 3) !== 0){if (headers_sent() !== true){if (strlen(session_id()) > 0) // If using sessions{session_regenerate_id(true); // Avoids session fixation attackssession_write_close(); // Avoids having sessions lock other requests}
if (strncmp('cgi', PHP_SAPI, 3) === 0){header(sprintf('Status: %03u', $code), true, $code);}
header('Location: ' . $url, true, (preg_match('~^30[1237]$~', $code) > 0) ? $code : 302);}
exit();}}

我还处理了支持不同HTTP重定向代码(301302303307)的问题,因为我在之前的回答的评论中已经解决了这个问题。以下是描述:

  • 301-永久移动
  • 302-找到
  • 303查看其他
  • 307-临时重定向(HTTP/1.1)

其中许多答案是正确的,但它们假设你有一个绝对URL,事实可能并非如此。如果你想使用相对URL并生成其余的,那么你可以这样做…

$url = 'http://' . $_SERVER['HTTP_HOST'];            // Get the server$url .= rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); // Get the current directory$url .= '/your-relative/path-goes/here/';            // <-- Your relative pathheader('Location: ' . $url, true, 302);              // Use either 301 or 302

使用echo从PHP输出JavaScript,这将完成这项工作。

echo '<script type="text/javascript">window.location = "http://www.google.com/"</script>';

除非你缓冲页面输出,然后再检查重定向条件,否则你无法在PHP中真正做到这一点。这可能太麻烦了。请记住,标头是从页面发送的第一件事。大多数重定向通常是在页面的后期需要的。为此,你必须缓冲页面的所有输出,并在稍后检查重定向条件。在这一点上,你可以重定向页面user head()或简单地回显缓冲的输出。

更多关于缓冲(优势)

什么是输出缓冲?

使用以下代码:

header("Location: /index.php");exit(0);

您可以使用一些JavaScript方法,如下所示

  1. self.location="http://www.example.com/index.php";

  2. window.location.href="http://www.example.com/index.php";

  3. document.location.href = 'http://www.example.com/index.php';

  4. window.location.replace("http://www.example.com/index.php");

用途:

<?php header('Location: another-php-file.php'); exit(); ?>

或者,如果您已经打开了PHP标记,请使用:

header('Location: another-php-file.php'); exit();

您还可以重定向到外部页面,例如:

header('Location: https://www.google.com'); exit();

确保包含exit()或包含die()

您可以使用会话变量来控制对页面的访问并授权有效用户:

<?phpsession_start();
if (!isset( $_SESSION["valid_user"])){header("location:../");exit();}
// Page goes here?>

http://php.net/manual/en/reserved.variables.session.php

最近,我受到了网络攻击,并决定,我需要知道试图访问管理面板或Web应用程序保留部分的用户。

因此,我在文本文件中添加了IP地址和用户会话的日志访问权限,因为我不想打扰我的数据库。

您可以尝试使用PHPheader函数进行重定向。您需要设置输出缓冲区,以便您的浏览器不会向屏幕抛出重定向警告。

ob_start();header("Location: " . $website);ob_end_flush();

以下是我的想法:

恕我直言,重定向传入请求的最佳方法是使用位置标头,即

<?phpheader("Location: /index.php");?>

执行此语句并输出后,浏览器将开始重定向用户。但是,在发送标头之前,请确保没有任何输出(任何回声/var_dump),否则会导致错误。

虽然这是一种快速而肮脏的方式来实现最初的要求,但最终会变成一场SEO灾难,因为这种重定向总是被解释为301/302重定向,因此搜索引擎将始终将您的索引页面视为重定向页面,而不是着陆页/主页面。

因此,它会影响网站的SEO设置。

使用PHP重定向的最佳方法是以下代码…

 header("Location: /index.php");

确保之后没有代码可以工作

header("Location: /index.php");

所有代码必须在上述行之前执行。

假设,

案例1:

echo "I am a web developer";header("Location: /index.php");

它将正确重定向到位置(index.php)。

案例2:

return $something;header("Location: /index.php");

上面的代码不会重定向到位置(index.php)。

1.不带页眉

在这里你不会遇到任何问题

 <?php echo "<script>location.href='target-page.php';</script>"; ?>

2.使用exit()的头函数

<?phpheader('Location: target-page.php');exit();?>

但是如果你使用头函数,那么有时你会得到"警告喜欢头已经发送"来解决在发送头之前不回显或打印的问题,或者您可以简单地使用die()exit()后头函数。

3.使用ob_start()ob_end_flush()的头函数

<?phpob_start(); //this should be first line of your pageheader('Location: target-page.php');ob_end_flush(); //this should be last line of your page?>

是的,可以使用PHP。我们将重定向到另一个页面。

尝试以下代码:

<?phpheader("Location:./"); // Redirect to index fileheader("Location:index.php"); // Redirect to index fileheader("Location:example.php");?>

用途:

<?phpheader('Location: redirectpage.php');header('Location: redirectpage.php');exit();echo "<script>location.href='redirectpage.php';</script>";?>

这是一个常规和普通的PHP重定向,但您可以通过以下代码等待几秒钟来制作重定向页面:

<?phpheader('refresh:5;url=redirectpage.php '); // Note: here 5 means 5 seconds wait for redirect.?>

如果您在Apache上运行,您还可以使用. htaccess进行重定向。

Redirect 301 / http://new-site.com/

用途:

<?php$url = "targetpage"function redirect$url(){if (headers_sent()) == false{echo '<script>window.location.href="' . $url . '";</script>';}}?>

是的,您可以使用分页标题函数,

header("Location: http://www.yourwebsite.com/user.php"); /* Redirect browser */exit();

最好的做法是在header()函数之后调用退出函数,以避免下面的代码执行。

根据留档,必须在发送任何实际输出之前调用header()

我们可以通过两种方式做到这一点:

  1. 当用户进入https://bskud.com/PINCODE/BIHAR/index.php然后重定向到https://bskud.com/PINCODE/BIHAR.php

    下面的PHP代码

    <?phpheader("Location: https://bskud.com/PINCODE/BIHAR.php");exit;?>

    将上述代码保存在https://bskud.com/PINCODE/BIHAR/index.php

  2. 当任何条件为真时,重定向到另一个页面:

    <?php$myVar = "bskud";if ($myVar == "bskud") {?>
    <script> window.location.href="https://bskud.com";  </script>
    <?php}else {echo "<b>Check the website name again</b>";}?>

有多种方法可以做到这一点,但如果您更喜欢php,我建议使用header()函数。

基本上

$your_target_url = “www.example.com/index.php”;header(“Location : $your_target_url”);exit();

如果你想提升它,最好在函数中使用它。这样,你就可以在其中添加身份验证和其他检查元素。

让我们通过检查用户的级别来尝试。

因此,假设您已将用户的权限级别存储在名为u_auth的会话中。

function.php

<?phpfunction authRedirect($get_auth_level,$required_level,$if_fail_link = “www.example.com/index.php”){if ($get_auth_level != $required_level){header(location : $if_fail_link);return false;exit();}else{return true;}}
. . .

然后,您将为要进行身份验证的每个页面调用该函数。

就像page.php或任何其他页面一样。

<?php
// page.php
require “function.php”
// Redirects to www.example.com/index.php if the// user isn’t authentication level 5authRedirect($_SESSION[‘u_auth’], 5);
// Redirects to www.example.com/index.php if the// user isn’t authentication level 4authRedirect($_SESSION[‘u_auth’], 4);
// Redirects to www.someotherplace.com/somepage.php if the// user isn’t authentication level 2authRedirect($_SESSION[‘u_auth’], 2, “www.someotherplace.com/somepage.php”);
. . .

参考文献;

要将访问者重定向到另一个页面(在条件循环中特别有用),只需使用以下代码:

<?phpheader('Location: mypage.php');?>

在这种情况下,mypage.php是您要将访问者重定向到的页面的地址。这个地址可以是绝对的,也可以包含这种格式的参数:mypage.php?param1=val1&m2=val2)

相对/绝对路径

处理相对或绝对路径时,最好从服务器根目录(DOCUMENT_ROOT)中选择绝对路径。使用以下格式:

<?phpheader('Location: /directory/mypage.php');?>

如果目标页面位于另一台服务器上,则需要包含完整的URL:

<?phpheader('Location: http://www.ccm.net/forum/');?>

超文本传输协议

根据HTTP协议,HTTP标头必须发送before任何类型的内容。这意味着在标头之前不应该发送任何字符-甚至不能发送空格!

临时/永久重定向

默认情况下,上述重定向类型是临时的。这意味着搜索引擎(例如Google搜索)在索引时不会考虑重定向。

如果您想通知搜索引擎页面已永久移动到另一个位置,请使用以下代码:

<?header('Status: 301 Moved Permanently', false, 301);header('Location: new_address');?>

例如,此页面包含以下代码:

<?header('Status: 301 Moved Permanently', false, 301);header('Location: /pc/imprimante.php3');exit();?>

当您点击上面的链接时,您会自动重定向到此页面。此外,这是一个永久重定向(状态:301移动永久)。因此,如果您在Google中输入第一个URL,您将自动重定向到第二个重定向链接。

PHP代码的解释

位于head()之后的PHP代码将被服务器解释,即使访问者移动到重定向中指定的地址。在大多数情况下,这意味着您需要一个方法来遵循exit()函数的header()函数,以减少服务器的负载:

<?header('Status: 301 Moved Permanently', false, 301);header('Location: address');exit();?>

1.使用header,一个内置的PHP函数

a)没有参数的简单重定向

<?phpheader('Location: index.php');?>

b)使用GET参数重定向

<?php$id = 2;header("Location: index.php?id=$id&msg=succesfully redirect");?>

2.在PHP中使用JavaScript重定向

a)没有参数的简单重定向

<?phpecho "<script>location.href='index.php';</script>";?>

b)使用GET参数重定向

<?php$id = 2;echo "<script>location.href='index.php?id=$id&msg=succesfully redirect';</script>";?>

试试这个

 $url = $_SERVER['HTTP_REFERER'];redirect($url);

我喜欢数秒后的重定向

<?php
header("Refresh: 3;url=https://theweek.com.br/índex.php");

使用头函数进行路由

<?phpheader('Location: B.php');exit();?>

假设我们想从A.php文件路由到B.php,而不必接受<button><a>的帮助。让我们看一个例子

<?phpif(isset($_GET['go_to_page_b'])) {header('Location: B.php');exit();
}?>
<p>I am page A</p><button name='go_to_page_b'>Page B</button>

B.php

<p> I am Page B</p>

要在php中重定向,请使用:

<?php header('Location: URL'); exit; ?>

你可以尝试使用

header('Location:'.$your_url)

更多信息可以参考php官方留档

header("Location: https://www.example.com/redirect.php");

直接重定向到此链接https://www.example.com/redirect.php

$redirect = "https://www.example.com/redirect.php";header("Location: $redirect");

首先获取$重定向值,然后重定向到[值],如:https://www.example.com/redirect.php