如何在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代码( 301
和307
)的问题,正如我在之前的回答中提到的那样,这里是描述:
- 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 ?>
你可以使用下面的一些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/