如何在PHP中进行重定向?

时间:2009-04-20 14:13:23

标签: php redirect

是否可以通过使用PHP将用户重定向到其他页面?

假设用户转到www.example.com/page.php并且我想将它们重定向到www.example.com/index.php,如何在不使用元刷新的情况下这样做?有可能吗?

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

36 个答案:

答案 0 :(得分:1578)

现有答案摘要加上我自己的两分钱:

1。基本答案

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

header('Location: '.$newURL);

2。重要细节

die()退出()

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

为什么要使用die()exit()The Daily WTF

绝对或相对网址

自2014年6月起,可以使用绝对和相对URL。请参阅已替换旧版RFC 7231RFC 2616,其中只允许使用绝对网址。

状态代码

PHP的“位置”-header仍然使用HTTP 302 - 重定向代码,但这不是您应该使用的代码。您应该考虑301(永久重定向)或303(其他)。

注意:W3C mentions 303-header与“许多pre-HTTP / 1.1用户代理”不兼容。目前使用的浏览器都是HTTP / 1.1用户代理。对于蜘蛛等许多其他用户代理来说,情况并非如此。和机器人。

3。文档

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

4。替代

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

5。辅助函数

此功能不包含303状态代码:

function Redirect($url, $permanent = false)
{
    header('Location: ' . $url, true, $permanent ? 301 : 302);

    exit();
}

Redirect('http://example.com/', false);

这更灵活:

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

6。解决方法

如上所述header()重定向只能在写出任何内容之前完成工作。如果输出invoked inmidst HTML,它们通常会失败。然后你可以使用HTML标题解决方法(不是很专业!),如:

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

甚至是JavaScript重定向。

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

答案 1 :(得分:103)

使用header() function发送HTTP Location header

header('Location: '.$newURL);

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

文件 example.php

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

三次执行的结果:

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

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

答案 2 :(得分:102)

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

    exit();
}

Redirect('http://www.google.com/', false);

别忘了死()/退出()!

答案 3 :(得分:93)

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

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

除非您缓冲页面输出然后检查重定向条件,否则您无法在PHP中真正执行此操作。这可能太麻烦了。请记住,标题是从页面发送的第一件事。大多数重定向通常在页面后面需要。为此,您必须缓冲页面的所有输出并稍后检查重定向条件。此时,您可以重定向页面用户标题()或只是回显缓冲的输出。

有关缓冲(优势)的更多信息

What is output buffering?

答案 4 :(得分:81)

  

<强> 1。在exit()

中使用标题功能
<?php 
     header('Location: target-page.php');
     exit();
?>

但是如果你使用标题功能,那么有时你会得到&#34;警告  喜欢标题已发送&#34; 以解决在发送标题之前不回显或打印的情况,或者您可以在标题功能之后使用die()exit()

  

<强> 2。没有标题

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

这里你不会遇到任何问题

  

第3。在ob_start()ob_end_flush()

中使用标题功能
<?php
ob_start(); //this should be first line of your page
header('Location: target-page.php');
ob_end_flush(); //this should be last line of your page
?>

答案 5 :(得分:52)

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

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

离开那个重要的第二行可能会看到你最终在The Daily WTF。问题是浏览器不 以尊重页面返回的标题,因此如果忽略标题,页面的其余部分将在没有重定向的情况下执行。

答案 6 :(得分:23)

使用:

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

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

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

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

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

确保包含exit()include die()

答案 7 :(得分:18)

这些答案中的许多都是正确的,但它们假设您有一个绝对的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 path
header('Location: ' . $url, true, 302);              // Use either 301 or 302

答案 8 :(得分:18)

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

<?php
    session_start();

    if (!isset( $_SESSION["valid_user"]))
    {
        header("location:../");
        exit();
    }

    // Page goes here
?>

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

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

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

答案 9 :(得分:13)

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

答案 10 :(得分:13)

我已经回答了这个问题,但我会再次这样做,因为在此期间我已经了解到如果你在CLI中运行会有特殊情况(重定向不会发生,因此不应该{{1或者,如果您的Web服务器将PHP作为(F)CGI运行(它需要先前设置的exit()标头才能正确重定向)。

Status

我还处理了支持不同HTTP重定向代码(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 attacks session_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(); } } 301302303)的问题,因为它在评论中得到了解决我之前的回答。以下是描述:

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

答案 11 :(得分:10)

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

答案 12 :(得分:8)

您可以使用下面的一些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");

答案 13 :(得分:7)

您可以使用此代码从一页重定向到另一页

header("Location: index.php");

或者如果您尝试使用php中的JavaScript进行重定向,请使用脚本标记进行重定向

echo "<script>window.open('your path where you redirect ','_self')</script>";

答案 14 :(得分:7)

使用:

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

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

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

答案 15 :(得分:7)

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

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

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

相对/绝对路径

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

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

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

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

HTTP标头

根据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中输入第一个网址,系统会自动将您重定向到第二个重定向链接。

解释PHP代码

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

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

答案 16 :(得分:7)

是的,您可以使用header()功能

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

最佳做法是在header()函数之后立即调用exit()函数,以避免以下代码执行。

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

答案 17 :(得分:6)

以下是我的想法:

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

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

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

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

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

答案 18 :(得分:6)

在语义网的前夕,正确性需要考虑。不幸的是,PHP的“位置” - 头仍然使用HTTP 302 - 重定向代码,严格地说,它不是重定向的最佳代码。它应该使用的是303一个。

W3C非常友好mention 303-header与“许多pre-HTTP / 1.1用户代理”不兼容,这相当于当前使用的浏览器。因此,302是遗物,不应该使用。

......或者你可以像其他人一样忽略它......

答案 19 :(得分:6)

像其他人一样说,发送位置标题:

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

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

此外,如果您打算使用此功能阻止某些网页中未经过身份验证的用户(如您所述),请记住某些用户代理will ignore this并继续保留当前页面,这样您就可以了发送后我需要死()。

答案 20 :(得分:5)

使用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)。

答案 21 :(得分:4)

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

请尝试以下代码:

<?php
    header("location:./"); // Redirect to index file
    header("location:index.php"); // Redirect to index file
    header("location:example.php");
?>

答案 22 :(得分:4)

对于重定向,请使用此代码

header("Location: http://www.example.com/blog");

答案 23 :(得分:3)

我们可以通过两种方式实现:

  1. 当用户访问https://bskud.com/PINCODE/BIHAR/index.php时,会重定向到https://bskud.com/PINCODE/BIHAR.php

    通过以下PHP代码

    <?php
        header("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>";
        }
    ?>
    

答案 24 :(得分:3)

我喜欢数秒后的重定向

<?php

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

答案 25 :(得分:2)

使用:

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

答案 26 :(得分:2)

1。使用header(内置的PHP函数)

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

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

b)使用GET参数重定向

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

2。使用PHP中的JavaScript重定向

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

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

b)使用GET参数重定向

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

答案 27 :(得分:2)

使用标题功能进行路由

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

假设我们要从 A.php 文件路由到 B.php ,而不需要我们使用<button><a>的帮助。让我们来看一个例子

<?php
if(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>

答案 28 :(得分:2)

要在PHP使用重定向:

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

答案 29 :(得分:1)

有多种方法可以执行此操作,但如果您更喜欢php,我建议您使用header()函数。

<强>基本上

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

如果你想提高一个档次,最好在功能中使用它。这样,您就可以在其中添加身份验证和其他检查元素。

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

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

function.php

<?php
    function 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 5
    authRedirect($_SESSION[‘u_auth’], 5);

    // Redirects to www.example.com/index.php if the
    // user isn’t authentication level 4
    authRedirect($_SESSION[‘u_auth’], 4);

    // Redirects to www.someotherplace.com/somepage.php if the
    // user isn’t authentication level 2
    authRedirect($_SESSION[‘u_auth’], 2, “www.someotherplace.com/somepage.php”);

    . . .

参考;

答案 30 :(得分:1)

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

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

答案 31 :(得分:1)

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

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

答案 32 :(得分:1)

有两种重定向方式

使用PHP

<?php 

header("Location: http://example.com/page.php");
die();
?>

使用Jquery

 $(document).ready(function(){  });

答案 33 :(得分:1)

您可以尝试使用

header('Location:'.$your_url)

有关更多信息,您可以参考php official documentation

答案 34 :(得分:0)

使用此代码可实现更好的重定向:

foldl

答案 35 :(得分:0)

尝试这个

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