如何在PHP中进行重定向?

How do I make a redirect in PHP?

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

假设用户转到www.example.com/page.php,我想将他们重定向到www.example.com/index.php,如果不使用meta-refresh,我该怎么做?有可能吗?

这甚至可以保护我的页面不被未经授权的用户访问。


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

1。基本回答

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

1
header('Location: '.$newURL);

2。重要细节

DIE()或Ext()

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

为什么要使用die()exit():每日WTF

绝对或相对URL

自2014年6月起,可以使用绝对和相对URL。请参阅RFC7231,它取代了旧的RFC2616,只允许绝对URL。

状态码

PHP的"location"头仍然使用HTTP302重定向代码,但这不是您应该使用的代码。您应该考虑301(永久重定向)或303(其他)。

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

三。文档

HTTP头和PHP中的header()函数

  • PHP手册上说了什么
  • 维基百科怎么说
  • W3C怎么说

4。选择

您可以使用http_redirect($url);的替代方法,它需要安装pecl包pecl。

5。帮助程序函数

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

1
2
3
4
5
6
7
8
function Redirect($url, $permanent = false)
{
    header('Location: ' . $url, true, $permanent ? 301 : 302);

    exit();
}

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

这更灵活:

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

6。解决办法

如前所述,header()重定向只在写出任何内容之前工作。如果在HTML输出中调用,它们通常会失败。然后您可以使用HTML头解决方案(不是很专业!)像:

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

或者一个javascript重定向。

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


使用header()函数发送HTTP Location头:

1
header('Location: '.$newURL);

与一些人的想法相反,die()与重定向无关。仅当您希望重定向而不是正常执行时才使用它。

文件example.php:

1
2
3
4
5
6
7
<?php
    header('Location: static.html');
    $fh = fopen('/tmp/track.txt', 'a');
    fwrite($fh, $_SERVER['REMOTE_ADDR'] . ' ' . date('c') ."
"
);
    fclose($fh);
?>

三次执行的结果:

1
2
3
4
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无关的城市传说。它与客户端"尊重"EDCOX1×5的头没有任何关系。发送报头不会停止PHP执行,不管客户端使用的是什么。


1
2
3
4
5
6
7
8
9
10
11
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()!


使用echo从PHP输出javascript,这将完成该任务。

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

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

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

什么是输出缓冲?


1. Using header function with exit()

1
2
3
4
<?php
     header('Location: target-page.php');
     exit();
?>

但是如果你使用页眉函数,那么有时你会得到"警告"。类似的报头已经发送"解决在发送报头之前不回传或打印",或者在头函数之后可以简单地使用EDCOX1×13或EDCOX1×0。

2. Without header

1
2
3
<?php
    echo"location.href='target-page.php';";
?>

在这里你不会面临任何问题

3. Using header function with ob_start() and ob_end_flush()

1
2
3
4
5
<?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
?>


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

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

离开这条至关重要的第二条线,你可能会看到你在每天的世界跆拳道上结束。问题是浏览器不必考虑页面返回的标题,因此在忽略标题的情况下,页面的其余部分将在不重定向的情况下执行。


用途:

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

或者,如果已经打开了php标记,请使用以下命令:

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

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

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

确保包括exit()include die()


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

1
2
3
4
5
6
7
8
9
10
11
<?php
    session_start();

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

    // Page goes here
?>

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

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

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


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

1
2
3
4
$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


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


我已经回答了这个问题,但我会再次回答,因为与此同时,我已经了解到,如果您在CLI中运行(重定向不会发生,因此不应该在exit()中运行),或者如果您的Web服务器将php作为(f)cgi运行(它需要一个以前设置的Status头来正确重定向),则会出现一些特殊情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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();
    }
}

我还处理了支持不同HTTP重定向代码(301302303307的问题,正如我先前回答的评论中所述。以下是说明:

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

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

您可以使用下面的一些javascript方法

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

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

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

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


  • 用途:

    1
    2
    3
    4
    5
    6
    <?php
        header('Location: redirectpage.php');
        header('Location: redirectpage.php');
        exit();
        echo"location.href='redirectpage.php';";
    ?>

    这是一个普通的PHP重定向,但是您可以通过下面的代码在几秒钟内完成重定向页面:

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


    像这里其他人说的,发送位置标题时使用:

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

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

    此外,如果您要使用此功能阻止某些页面上未经身份验证的用户(如您所提到的),请记住,某些用户代理将忽略此功能并继续在当前页面上运行,因此发送后您需要死亡()。


    以下是我的想法:

    imho,重定向传入请求的最佳方法是使用location headers,即

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

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

    虽然这是一个快速和肮脏的方式来实现最初的要求,它最终会成为一个搜索引擎优化灾难,因为这种重定向总是被解释为301/302重定向,因此搜索引擎将始终看到你的索引页是一个重新定向的页,而不是一个登陆页/主页。

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


    是的,可以使用header()函数,

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

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

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


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

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

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

    相对/绝对路径

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

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

    如果目标页面位于其他服务器上,则包括完整的URL:

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

    HTTP头处理模块

    根据HTTP协议,HTTP报头必须发送EDCOX1,9,任何类型的内容。这意味着任何字符都不应该在页眉前发送——甚至没有一个空的空间!

    临时/永久重定向

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

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

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

    例如,此页具有以下代码:

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

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

    PHP代码解释

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

    1
    2
    3
    4
    5
    <?
        header('Status: 301 Moved Permanently', false, 301);
        header('Location: address');
        exit();
    ?>


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

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

    确保之后没有代码可用

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

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

    假设,

    案例1:

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

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

    案例2:

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

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


    在语义Web的前夕,正确性是值得考虑的。不幸的是,PHP的"location"头仍然使用HTTP302重定向代码,严格来说,这不是最好的重定向代码。它应该使用的是303。

    W3C非常客气地提到303头与"许多HTTP/1.1之前的用户代理"不兼容,这意味着当前没有浏览器。所以,302是一件文物,不应该使用。

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


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

    尝试以下代码:

    1
    2
    3
    4
    5
    <?php
        header("location:./"); // Redirect to index file
        header("location:index.php"); // Redirect to index file
        header("location:example.php");
    ?>

    我们可以用两种方式做到:

  • 当用户访问https://bskud.com/pincode/bihar/index.php时,重定向至https://bskud.com/pincode/bihar.php。

    通过下面的PHP代码

    1
    2
    3
    4
    <?php
        header("Location: https://bskud.com/PINCODE/BIHAR.php");
        exit;
    ?>

    将上述代码保存在https://bskud.com/pincode/bihar/index.php中

  • 如果任何条件为真,则重定向到另一页:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
        $myVar ="bskud";
        if ($myVar =="bskud") {
    ?>

     window.location.href="https://bskud.com";  

    <?php
        }
        else {
            echo"Check the website name again";
        }
    ?>

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

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

    用途:

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
        $url ="targetpage"
        function redirect$url(){
            if (headers_sent()) == false{
                echo 'window.location.href="' . $url . '";';
            }
        }
    ?>


    1。使用header,一个内置的php函数

    a)无参数的简单重定向

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

    b)使用get参数重定向

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

    2。用PHP中的javascript重定向

    a)无参数的简单重定向

    1
    2
    3
    <?php
         echo"location.href='index.php';";
     ?>

    b)使用get参数重定向

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

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

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

    或者,如果您尝试在PHP中使用javascript重定向,则使用脚本标记进行重定向。

    1
    echo"window.open('your path where you redirect ','_self')";

    如果您运行的是Apache,那么也可以使用.htaccess进行重定向。

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

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

    基本上

    1
    2
    3
    $your_target_url ="www.example.com/index.php";
    header("Location : $your_target_url");
    exit();

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

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

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

    function.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?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或任何其他页面。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?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");

        . . .

    参考文献;

    • http://php.net/manual/en/function.header.php

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

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


    使用此代码进行更好的重定向:

    1
    2
    3
    $ref="http://www.example.com';
    echo 'window.location ="
    '.$ref.'";';  
    exit;