如何在PHP中redirect?

是否有可能通过使用PHP将用户redirect到不同的页面?

假设用户访问www.example.com/page.php ,我想将它们redirect到www.example.com/index.php ,我将如何在不使用元刷新的情况下这么做? 可能?

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

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

1.基本答案

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

 header('Location: '.$newURL); 

2.重要的细节

死()退出()

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

为什么你应该使用die()exit() : 每日跆拳道

绝对url

该url必须是绝对的。 请参阅RFC 2616 。 但是在大多数情况下,相对URL也会被接受。

状态码

PHP的“位置”标题仍然使用HTTP 302redirect代码,但这不是你应该使用的。 你应该考虑301 (永久redirect)或303 (其他)。

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

3.文件

HTTP头和PHP中的header()函数

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

4.替代品

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

5.助手function

此function不包含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()才会redirect。 如果在HTML输出中被调用,他们通常会失败。 那么你可以使用一个HTML头解决方法(不是很专业!),如:

  <meta http-equiv="Location" content="http://example.com/"> 

或甚至一个Javascriptredirect。

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

不要忘了死()/退出()!

使用echo输出来自PHP的JavaScript,它将完成这项工作。

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

除非你缓冲页面输出,然后再检查redirect条件,否则你不能在PHP中做到这一点。 这可能太麻烦了。 请记住,头是从页面发送的第一件事。 大多数redirect通常在页面稍后需要。 为此,您必须缓冲页面的所有输出,并稍后检查redirect条件。 在这一点上,您可以redirect页面用户头()或只是回应缓冲的输出。

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

什么是输出缓冲?

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

 header('Location: '.$newURL); 

相反,有些人认为, die()与redirect无关。 只有当你想redirect而不是正常执行时才使用它。

使用example.php:

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

结果或3处决:

 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的执行。

这些答案中的大部分都忘记了一个非常重要的步骤!

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

离开这个重要的第二条线可能会看到你最终每日WTF 。 问题是,浏览器不必尊重你的页面返回的头,所以在头被忽略的情况下,页面的其余部分将被执行而没有redirect。

1.通过exit()使用头函数

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

但是如果你使用头函数,那么有时你会得到“像头已经发送的警告”来解决这个问题,在发送头文件之前不要回显或者打印,或者你可以简单地在头函数之后使用die()或者exit()

2.没有标题

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

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

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

 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 
 <?php header('Location: another-php-file.php'); exit(); ?> 

或者如果你已经打开php标签,使用这个:

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

您也可以redirect到外部页面,例如:

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

确保你包含exit()或者include die()

这些答案中的许多是正确的,但他们认为你有一个绝对的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 

我已经回答了这个问题,但我会再次这样做,因为在此期间,我已经了解到,如果您在CLI中运行(redirect不能发生,因此不应该exit() ),或者如果您的networking服务器运行PHP作为(F)CGI(它需要一个以前设置的Status头才能正确redirect)。

 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(); } } 

我还处理了支持不同的HTTPredirect代码( 301307 )的问题,正如我在之前的回答中提到的那样,这里是描述:

  • 301 – 永久移动
  • 302 – find
  • 303 – 见其他
  • 307 – 临时redirect(HTTP / 1.1)
 header("Location: /index.php"); exit(0); 

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

您可以使用会话variables来控制对页面的访问,并授权有效的用户。

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

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

你可以使用下面的一些Java脚本方法

  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"); 

像这里的其他人一样,发送位置标题:

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

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

此外,如果您要使用此function来阻止来自某些网页的未经身份validation的用户,请记住,某些用户代理将忽略此操作并继续在当前网页上继续使用,因此您需要)发送之后。

在语义网的前夜,正确性是需要考虑的。 不幸的是,PHP的“位置”标题仍然使用HTTP 302redirect代码,严格来说,它并不是最好的redirect代码。 它应该使用的是303的一个。

W3C非常友好地提到 303-header与“许多HTTP / 1.1之前的用户代理”是不兼容的,这就等于没有使用浏览器。 所以,302是一个遗物, 应该使用。

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

可能来不及回答这个问题了。 不过,这是我的想法:

恕我直言,redirect传入请求的最好方法是通过使用位置标题

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

一旦这个语句被执行,并且输出被发送出去,浏览器将开始redirect用户。 但是,确保在发送头文件之前没有任何输出(任何echo / var_dump),否则会导致错误。

虽然这是一个快速和肮脏的方式来实现最初的要求,但它最终会变成一个search引擎优化的灾难,因为这种重新指导总是被解释为301/302redirect,因此search引擎将始终将您的索引页面视为redirect页面,而不是login页面/主页面。 因此会影响网站的SEO设置。

用PHPredirect的最佳方法是下面的代码…

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

确保没有代码将工作后

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

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

假设,

情况1:

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

它会正确地redirect到位置(index.php)。

案例2:

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

上面的代码将不会redirect到位置(index.php)。

希望很明显。

是的,可以使用PHP,我们将redirect到另一个页面,试试这个:

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

这是正常的和正常的PHPredirect,但你可以redirect一个页面,几秒钟之后等待下面的代码:

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

你可以在php: header中更新标题

您可以尝试使用php头function来做redirect。 您将需要设置输出缓冲区,以便您的浏览器不会向屏幕发出redirect警告。

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

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

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