是否可以通过使用PHP将用户重定向到不同的页面?
假设用户去了www.example.com/page.php
,我想将它们重定向到www.example.com/index.php
,如何在不使用元刷新的情况下这样做?可能吗?
这甚至可以保护我的页面免受未经授权的用户
现有答案摘要加上我自己的两分钱:
您可以使用该header()
函数发送新的HTTP标头,但必须在任何HTML或文本之前将其发送到浏览器(例如,在声明之前).
header('Location: '.$newURL);
die()或exit()
header("Location: http://example.com/myOtherPage.php"); die();
为什么你应该使用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用户代理.对于蜘蛛和机器人等许多其他用户代理来说并非如此.
HTTP标头和header()
PHP中的功能
PHP手册说的是什么
维基百科说的是什么
W3C说的是什么
您可以使用http_redirect($url);
需要安装PECL包pecl的替代方法.
此功能不包含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(); }
如上所述,header()
重定向仅在写出任何内容之前有效.如果调用最小的HTML输出,它们通常会失败.然后你可以使用HTML标题解决方法(不是很专业!),如:
或者甚至是JavaScript重定向.
window.location.replace("http://example.com/");
使用该header()
函数发送HTTP Location
标头:
header('Location: '.$newURL);
与某些人的想法相反,die()
与重定向无关.仅在您要重定向而不是正常执行时使用它.
文件example.php:
三次执行的结果:
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执行.
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 '';
除非您缓冲页面输出,然后检查重定向条件,否则您无法在PHP中真正执行此操作.这可能太麻烦了.请记住,标题是从页面发送的第一件事.大多数重定向通常在页面后面需要.为此,您必须缓冲页面的所有输出并稍后检查重定向条件.此时,您可以重定向页面用户标题()或只是回显缓冲输出.
有关缓冲的更多信息(优点)
什么是输出缓冲?
1.使用标题功能
exit()
但是如果你使用标题功能,那么有时你会得到"像已经发送的标题一样的警告"以解决在发送标题之前不回显或打印,或者你可以简单地使用die()
或exit()
在标题函数之后.
2.没有标题
location.href='target-page.php';"; ?>
在这里你不会遇到任何问题
3.使用带
ob_start()
和的头功能ob_end_flush()
大多数答案都忘记了非常重要的一步!
header("Location: myOtherPage.php"); die();
离开那个重要的第二线可能会看到你最终在每日WTF.问题是,浏览器不具备尊重,你的页面返回,所以用被忽略标题,页面的其余部分将不重定向执行的头.
使用:
或者,如果您已经打开了PHP标记,请使用:
header('Location: another-php-file.php'); exit();
您还可以重定向到外部页面,例如:
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
您可以使用会话变量来控制对页面的访问并授权有效用户:
http://php.net/manual/en/reserved.variables.session.php.
最近,我接受了网络攻击并决定,我需要知道用户试图访问管理面板或保留部分Web应用程序.
因此,我在文本文件中添加了IP地址和用户会话的日志访问权限,因为我不想打扰我的数据库.
重定向有两种方法
使用PHP
使用jQuery
header( 'Location: http://www.yoursite.com/new_page.html' );
我已经回答了这个问题,但是我会再次这样做,因为在此期间我已经了解到有特殊情况,如果你在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(); } }
我也处理的支持不同的HTTP重定向代码(这个问题301
,302
,303
和307
),因为它是在我以前的答复的意见中提到.以下是说明:
301 - 永久移动
302 - 发现
303 - 见其他
307 - 临时重定向(HTTP/1.1)
header("Location: /index.php"); exit(0);
您可以使用此代码从一页重定向到另一页
header("Location: index.php");
或者,如果您尝试使用PHP中的JavaScript进行重定向,请使用脚本标签进行重定向
echo "";
您可以使用下面的一些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");
使用:
location.href='redirectpage.php';"; ?>
这是一个常规和正常的PHP重定向,但您可以通过以下代码等待几秒钟重定向页面:
在语义网的前夕,正确性需要考虑.不幸的是,PHP的"Location"-header仍然使用HTTP 302 -redirect代码,严格地说,它不是重定向的最佳代码.它应该使用的是303.
W3C非常友好地提到 303-header与"许多pre-HTTP/1.1用户代理"不兼容,这相当于当前使用的浏览器.因此,302是遗物,不应该使用.
......或者你可以像其他人一样忽略它......
是的,你可以使用header()函数,
header("Location: http://www.yourwebsite.com/user.php"); /* Redirect browser */ exit();
并且最佳实践是在函数之后立即调用exit()header()
函数以避免下面的代码执行.
根据文档,header()
必须在发送任何实际输出之前调用.
要将访问者重定向到另一个页面(在条件循环中特别有用),只需使用以下代码:
在这种情况下,mypage.php
是您要将访问者重定向到的页面的地址.此地址可以是绝对地址,也可以包含以下格式的参数:mypage.php?param1=val1&m2=val2)
相对/绝对路径
处理相对路径或绝对路径时,最好从服务器的根目录(DOCUMENT_ROOT)中选择绝对路径.使用以下格式:
如果目标页面位于另一台服务器上,则包含完整的URL:
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(); ?>
像其他人一样说,发送位置标题:
header( "Location: http://www.mywebsite.com/otherpage.php" );
但是在将任何其他输出发送到浏览器之前,您需要执行此操作.
此外,如果您打算使用此功能阻止某些页面中未经过身份验证的用户(如您所述),请记住,某些用户代理会忽略此操作并继续在当前页面上进行操作,因此您需要死掉( )发送后.
这是我的想法:
恕我直言,重定向传入请求的最佳方法是使用位置标头
执行此语句并将输出发送出去后,浏览器将开始重定向用户.但是,确保在发送标头之前没有任何输出(任何echo/var_dump),否则会导致错误.
虽然这是一种快速而肮脏的方式来实现最初的问题,但它最终会变成SEO灾难,因为这种重定向总是被解释为301/302重定向,因此搜索引擎总会看到你的索引页面作为重定向页面,而不是登录页面/主页面.
因此它会影响网站的SEO设置.
使用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).