如何在PHP中进行重定向?

Sam*_*Sam 1201 php redirect

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

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

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

mar*_*kus 1642

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

1.基本答案

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

header('Location: '.$newURL);
Run Code Online (Sandbox Code Playgroud)

2.重要细节

die()exit()

header("Location: http://example.com/myOtherPage.php");
die();
Run Code Online (Sandbox Code Playgroud)

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

绝对或相对URL

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

状态代码

PHP的"Location"-header仍然使用HTTP 302 -redirect代码,但这不是您应该使用的代码.您应该考虑301(永久重定向)或303(其他).

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

3.文件

HTTP标头和header()PHP中的功能

4.替代品

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

5.助手功能

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

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

    exit();
}

Redirect('http://example.com/', false);
Run Code Online (Sandbox Code Playgroud)

这更灵活:

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

6.解决方法

如上所述,header()重定向仅在写出任何内容之前有效.如果调用最小的HTML输出,它们通常会失败.然后你可以使用HTML标题解决方法(不是很专业!),如:

 <meta http-equiv="refresh" content="0;url=finalpage.html">
Run Code Online (Sandbox Code Playgroud)

或者甚至是JavaScript重定向.

window.location.replace("http://example.com/");
Run Code Online (Sandbox Code Playgroud)

  • _Never_发出301,除非你_mean it_.301表示永久性,永久性意味着_permanent_,意味着它将被用户代理缓存,意味着长时间充满咖啡因的夜晚盯着应用程序日志,想知道你是否因为发誓某些页面应该被调用或更新而发疯,并且你发誓对于上帝,它适用于您的机器,但不适用于客户的机器.如果您绝对必须调用301,请在资源上放置一个cache-control max-age.你没有无限的智慧,你不应该像你一样行事. (68认同)
  • 遗憾的是,每日WTF的故事很常见.无论如何,这不是缺失的死因导致问题,而是一个糟糕的设计.99.9%的情况下,猛烈关闭这个过程是错误的.一个常见的,更清晰的解决方案(不是我最喜欢的)是抛出RedirectionException并在应用程序入口点捕获它.在那之后你可以拥有所有的"后*"电话(日志/关闭连接/什么) (6认同)
  • 这个答案的一些问题:303可能不是"正确的"状态代码.例如,Google可能需要301.其次,`header('Location:'.$ newURL);`必须在任何HTML(或文本)传递给浏览器之前,否则它将无法正常工作. (5认同)
  • 所有浏览器都不支持`http-equiv ="Location".你应该使用`refresh`代替!`<meta http-equiv ="refresh"content ="0; url = http://example.com/">` (4认同)
  • 但有没有理由使用骰子退出?退出似乎更清洁,更合适. (2认同)
  • 如果您在框架中执行此操作,那么“die()”或“exit()”可能是您最不应该做的事情。检查如何从框架中干净地退出,以便它有机会记录内容、清理、关闭文件等。当然,框架可能已经有一个辅助函数或方法来执行重定向,但我提到这一点因为最好不要养成只执行“exit()”而不考虑应用程序后果的习惯。 (2认同)

var*_*tec 114

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

header('Location: '.$newURL);
Run Code Online (Sandbox Code Playgroud)

与某些人的想法相反,die()与重定向无关.在您要重定向而不是正常执行时使用它.

文件example.php:

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

三次执行的结果:

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

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

  • @clawr:不,`exit()`是为了防止页面显示剩余的内容(想想限制页面).vartec是对的,它**与HTTP Location头**无关,你不需要`exit`.我选择将它包含在我的答案中,因为对于那些不知道如何进行简单*重定向的人来说,一个人可能会安全而不是实现一个简单而关键的步骤,这样他才能利用*先进的*过程控制. (11认同)
  • die()或exit()适用于不尊重"Location:..."标题的客户端 (6认同)
  • 但是尊重标题的浏览器将离开页面并在您的脚本仍在执行时关闭连接。这完全不好。PHP 将继续执行脚本一段时间(这就是您的代码执行的原因),但可能会在执行过程中随机中止它,从而导致内容损坏。调用 ignore_user_abort() 会阻止这种情况,但我真的不值得。继续你的 HTML 写东西(虽然可能没用),但不要在 header('Location:'); 之后写在磁盘或数据库上的东西;如果可能,在重定向之前写入磁盘。[另外:url 应该是绝对的。] (2认同)

Ali*_*xel 106

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

    exit();
}

Redirect('http://www.google.com/', false);
Run Code Online (Sandbox Code Playgroud)

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

  • ...并且不要忘记打印输出somthign,例如"你将在$ n秒内被重定向到$ nepage,如果重定向不发生,请点击这里的$ link"有些更加黑暗,一些浏览器的设置可能会失败重定向. (8认同)
  • 不要忘记输出缓冲,否则你最终会得到'已发送的标题'. (6认同)
  • @DaNieL:这种类型的重定向不会花费"$ n秒".它会立即发生,任何符合标准的浏览器都应该处理它.我认为你正在考虑人们在不知道更好的情况下使用的"元刷新"重定向. (3认同)
  • 安德鲁:HTTP浏览器怎么能不尊重位置:? (3认同)
  • 哪些浏览器是这些? (2认同)

Ham*_*han 98

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

echo '<script type="text/javascript">
           window.location = "http://www.google.com/"
      </script>';
Run Code Online (Sandbox Code Playgroud)

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

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

什么是输出缓冲?

  • 错了,即使没有缓冲,您也可以(并且应该)在 PHP 中执行此操作:在设计良好的页面中,所有相关的 PHP 处理都应该在任何 HTML 内容发送给用户之前进行。这样 PHP 重定向就可以正常工作了。 (4认同)
  • javascript 不会自动激活,事实上这只适用于现代浏览器。另外,问题是关于 php,而不是 JS (3认同)
  • 简单到点答案!非常适合简单的页面重定向! (2认同)

Jun*_*ari 84

1.使用标题功能 exit()

<?php 
     header('Location: target-page.php');
     exit();
?>
Run Code Online (Sandbox Code Playgroud)

但是如果你使用标题功能,那么有时你会得到"像已经发送的标题一样的警告"以解决在发送标题之前不回显或打印,或者你可以简单地使用die()exit()在标题函数之后.

2.没有标题

<?php 
    echo "<script>location.href='target-page.php';</script>";
?>
Run Code Online (Sandbox Code Playgroud)

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

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


nic*_*ckf 54

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

header("Location: myOtherPage.php");
die();
Run Code Online (Sandbox Code Playgroud)

离开那个重要的第二线可能会看到你最终在每日WTF.问题是,浏览器不具备尊重,你的页面返回,所以用被忽略标题,页面的其余部分将不重定向执行的头.

  • @DaNieL:把它改成死("停止忽略我的标题!") (13认同)
  • 你假设脚本除了重定向之外没什么可做的.这根本不是真的. (3认同)
  • 我喜欢`die()的简单解释;`你给了 - 如果你不这样做,用户可能会看到整个页面,如果你使用它; 用户将被重定向,并且没有临时内容故障将显示+ 1 (3认同)

小智 23

使用:

<?php header('Location: another-php-file.php'); exit(); ?>
Run Code Online (Sandbox Code Playgroud)

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

header('Location: another-php-file.php'); exit();
Run Code Online (Sandbox Code Playgroud)

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

header('Location: https://www.google.com'); exit();
Run Code Online (Sandbox Code Playgroud)

确保包含 exit()include die().


Luk*_*uke 19

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


Asu*_*o12 19

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

<?php
    session_start();

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

    // Page goes here
?>
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 19

重定向有两种方法

使用PHP

<?php 

header("Location: http://example.com/page.php");
die();
?>
Run Code Online (Sandbox Code Playgroud)

使用jQuery

<script>

     $(document).ready(function(){
    location.href = 'http://example.com/page.php';
     });

</script>
Run Code Online (Sandbox Code Playgroud)


Dan*_*ite 14

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


Ali*_*xel 14

我已经回答了这个问题,但是我会再次这样做,因为在此期间我已经了解到有特殊情况,如果你在CLI中运行(重定向不会发生,因此不应该exit())或者你的网络服务器是将PHP作为(F)CGI运行(它需要先前设置的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 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我也处理的支持不同的HTTP重定向代码(这个问题301,302,303307),因为它是在我以前的答复的意见中提到.以下是说明:

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


Cod*_*AIK 11

header("Location: https://www.example.com/redirect.php");
Run Code Online (Sandbox Code Playgroud)

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

$redirect = "https://www.example.com/redirect.php";
header("Location: $redirect");
Run Code Online (Sandbox Code Playgroud)

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


joa*_*16v 10

header("Location: /index.php");
exit(0);   
Run Code Online (Sandbox Code Playgroud)


Kas*_*hif 10

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

header("Location: index.php");
Run Code Online (Sandbox Code Playgroud)

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

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


Vik*_*ote 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");


Bha*_*ama 8

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

尝试以下代码:

<?php
    header("Location:./"); // Redirect to index file
    header("Location:index.php"); // Redirect to index file
    header("Location:example.php");
?>
Run Code Online (Sandbox Code Playgroud)


小智 8

使用:

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

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

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


Hen*_*aul 7

在语义网的前夕,正确性需要考虑.不幸的是,PHP的"Location"-header仍然使用HTTP 302 -redirect代码,严格地说,它不是重定向的最佳代码.它应该使用的是303.

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

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


Cas*_*per 7

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

header("Location: http://www.yourwebsite.com/user.php"); /* Redirect browser */
exit();
Run Code Online (Sandbox Code Playgroud)

并且最佳实践是在函数之后立即调用exit()header()函数以避免下面的代码执行.

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


Sta*_*tar 7

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

<?php
    header('Location: mypage.php');
?>
Run Code Online (Sandbox Code Playgroud)

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

相对/绝对路径

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

<?php
    header('Location: /directory/mypage.php');
?>
Run Code Online (Sandbox Code Playgroud)

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

<?php
    header('Location: http://www.ccm.net/forum/');
?>
Run Code Online (Sandbox Code Playgroud)

HTTP标头

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

临时/永久重定向

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

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

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: new_address');
?>
Run Code Online (Sandbox Code Playgroud)

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

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

当您单击上面的链接时,您将自动重定向到此页面.此外,它是永久重定向(状态:301永久移动).因此,如果您在Google中输入第一个网址,系统会自动将您重定向到第二个重定向链接.

解释PHP代码

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

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: address');
    exit();
?>
Run Code Online (Sandbox Code Playgroud)


小智 6

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

header( "Location: http://www.mywebsite.com/otherpage.php" );
Run Code Online (Sandbox Code Playgroud)

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

此外,如果您打算使用此功能阻止某些页面中未经过身份验证的用户(如您所述),请记住,某些用户代理会忽略此操作并继续在当前页面上进行操作,因此您需要死掉( )发送后.


Bha*_*nik 6

这是我的想法:

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

<?php
    header("Location: /index.php");
?>
Run Code Online (Sandbox Code Playgroud)

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

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

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


Kev*_*our 6

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

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


sab*_*buz 5

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

 header("Location: /index.php");
Run Code Online (Sandbox Code Playgroud)

确保之后没有代码可用

header("Location: /index.php");
Run Code Online (Sandbox Code Playgroud)

所有代码必须在上面的行之前执行.

假设,

情况1:

echo "I am a web developer";
header("Location: /index.php");
Run Code Online (Sandbox Code Playgroud)

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

案例2:

return $something;
header("Location: /index.php");
Run Code Online (Sandbox Code Playgroud)

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


小智 5

您可以尝试使用

header('Location:'.$your_url)
Run Code Online (Sandbox Code Playgroud)

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