是否可以通过使用PHP将用户重定向到其他页面?
假设用户转到www.example.com/page.php
并且我想将其重定向到www.example.com/index.php
,那么在不使用元刷新的情况下该怎么做?可能吗?
这甚至可以保护我的页面免受未经授权的用户的侵害。
protection from unauthorized users
via重定向;这不是应该做的事情;)
是否可以通过使用PHP将用户重定向到其他页面?
假设用户转到www.example.com/page.php
并且我想将其重定向到www.example.com/index.php
,那么在不使用元刷新的情况下该怎么做?可能吗?
这甚至可以保护我的页面免受未经授权的用户的侵害。
protection from unauthorized users
via重定向;这不是应该做的事情;)
Answers:
现有答案的摘要加上我自己的两分钱:
您可以使用该header()
函数发送新的HTTP标头,但是必须在发送任何HTML或文本之前(<!DOCTYPE ...>
例如,在声明之前)将其发送到浏览器。
header('Location: '.$newURL);
die()或exit()
header("Location: http://example.com/myOtherPage.php");
die();
为什么要使用die()
或exit()
:每日WTF
绝对或相对URL
自2014年6月起,绝对URL和相对URL均可使用。请参阅RFC 7231,该文件已替换了旧的RFC 2616,其中仅允许绝对URL。
状态码
PHP的“位置”标头仍使用HTTP 302重定向代码,但这不是您应该使用的代码。您应该考虑301(永久重定向)或303(其他)。
注意:W3C提到 303标头与“许多HTTP / 1.1之前的用户代理不兼容。当前使用的浏览器都是HTTP / 1.1用户代理。对于许多其他用户代理(例如蜘蛛网和漫游器)而言,情况并非如此。
HTTP标头和header()
PHP中的函数
您可以使用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标头解决方法(不是很专业!),例如:
<meta http-equiv="refresh" content="0;url=finalpage.html">
甚至JavaScript重定向。
window.location.replace("http://example.com/");
header('Location: '.$newURL);
必须在将任何HTML(或文本)传递到浏览器之前,否则不能正常工作。
http-equiv="Location"
并非所有浏览器都支持。您应该refresh
改用!<meta http-equiv="refresh" content="0;url=http://example.com/">
使用该header()
函数发送HTTP Location
标头:
header('Location: '.$newURL);
与某些人认为的相反,die()
它与重定向无关。仅当您要重定向而不是正常执行时才使用它。
文件example.php:
<?php
header('Location: static.html');
$fh = fopen('/tmp/track.txt', 'a');
fwrite($fh, $_SERVER['REMOTE_ADDR'] . ' ' . date('c') . "\n");
fclose($fh);
?>
三个执行的结果:
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执行。
exit()
是为了防止页面显示剩余内容(请考虑限制页面)。vartec是正确的,它与HTTP Location标头无关,您也不需要exit
。我选择将其包含在我的答案中,因为对于一个不知道如何进行简单重定向的人,最好还是起着安全的作用,而不是不执行简单但关键的步骤,以使他能够利用高级流程控制。
.htaccess
重定向,但我需要一种方法以某种方式将哪个域重定向到最终域?
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,即可完成工作。
echo '<script type="text/javascript">
window.location = "http://www.google.com/"
</script>';
除非缓冲页面输出然后在以后检查重定向条件,否则您实际上无法在PHP中执行此操作。那可能太麻烦了。请记住,标题是从页面发送的第一件事。大多数重定向通常在页面的稍后部分是必需的。为此,您必须缓冲页面的所有输出,并在以后检查重定向条件。那时,您可以重定向页面用户header()或仅回显缓冲的输出。
有关缓冲的更多信息(优势)
Cannot modify header information - headers already sent by
错误。
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()
<?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
?>
这些答案大多数都忘记了非常重要的一步!
header("Location: myOtherPage.php");
die();
撇开第二条至关重要的电话,您可能最终会进入《每日WTF》。问题是,浏览器不具备尊重,你的页面返回,所以用被忽略标题,页面的其余部分将不重定向执行的头。
die();
您提供的简单说明-如果您不这样做,那么如果您确实使用它,用户可能会看到一整页的内容;用户将被重定向,并且不会显示临时内容故障+ 1
您可以使用会话变量来控制对页面的访问并授权有效用户:
<?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并生成其余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中运行(重定向无法发生,因此应该不会发生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
),因为它是在我以前的答复的意见中提到。以下是说明:
要将访问者重定向到另一个页面(在条件循环中特别有用),只需使用以下代码:
<?php
header('Location: mypage.php');
?>
在这种情况下,mypage.php
是您要将访问者重定向到的页面的地址。该地址可以是绝对地址,也可以包含以下格式的参数:mypage.php?param1=val1&m2=val2)
相对/绝对路径
处理相对路径或绝对路径时,理想的是从服务器的根目录(DOCUMENT_ROOT)中选择一个绝对路径。使用以下格式:
<?php
header('Location: /directory/mypage.php');
?>
如果目标页面位于另一台服务器上,则包括完整的URL:
<?php
header('Location: http://www.ccm.net/forum/');
?>
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中输入第一个URL,则会自动将您重定向到第二个重定向的链接。
PHP代码解读
即使访问者移动到重定向中指定的地址,服务器也会解释header()之后的PHP代码。在大多数情况下,这意味着您需要一种方法来遵循该header()
函数的exit()
功能,以减轻服务器的负载:
<?
header('Status: 301 Moved Permanently', false, 301);
header('Location: address');
exit();
?>
采用:
<?php
header('Location: redirectpage.php');
header('Location: redirectpage.php');
exit();
echo "<script>location.href='redirectpage.php';</script>";
?>
这是常规的和正常的PHP重定向,但是您可以通过以下代码创建一个重定向页面,等待几秒钟:
<?php
header('refresh:5;url=redirectpage.php '); // Note: here 5 means 5 seconds wait for redirect.
?>
您可以使用如下所示的一些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");
就像这里所说的其他人一样,发送带有以下内容的位置标头:
header( "Location: http://www.mywebsite.com/otherpage.php" );
但是您需要先执行此操作,然后再将其他任何输出发送到浏览器。
另外,如果您要使用它来阻止某些页面上未经身份验证的用户(如您提到的那样),请记住,某些用户代理将忽略此内容并继续在当前页面上继续,因此您需要死亡( )发送后。
but you need to do it before you've sent any other output to the browser.
太棒了!! 我一直在寻找关于为什么我不断收到标头已发送错误的记录。+1!
die()
只是做到这一点的一种方法。
这是我的想法:
恕我直言,重定向传入请求的最佳方法是使用位置标头,
<?php
header("Location: /index.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)。
是的,可以使用PHP。我们将重定向到另一个页面。
尝试以下代码:
<?php
header("Location:./"); // Redirect to index file
header("Location:index.php"); // Redirect to index file
header("Location:example.php");
?>
1.使用header
,内置的PHP函数
a)没有参数的简单重定向
<?php
header('Location: index.php');
?>
b)使用GET参数重定向
<?php
$id = 2;
header("Location: index.php?id=$id&msg=succesfully redirect");
?>
2.在PHP中使用JavaScript进行重定向
a)没有参数的简单重定向
<?php
echo "<script>location.href='index.php';</script>";
?>
b)使用GET参数重定向
<?php
$id = 2;
echo "<script>location.href='index.php?id=$id&msg=succesfully redirect';</script>";
?>
我们可以通过两种方式做到这一点:
当用户进入https://bskud.com/PINCODE/BIHAR/index.php时,然后重定向到https://bskud.com/PINCODE/BIHAR.php
通过下面的PHP代码
<?php
header("Location: https://bskud.com/PINCODE/BIHAR.php");
exit;
?>
如果满足任何条件,则重定向到另一页:
<?php
$myVar = "bskud";
if ($myVar == "bskud") {
?>
<script> window.location.href="https://bskud.com"; </script>
<?php
}
else {
echo "<b>Check the website name again</b>";
}
?>
header()
函数。
采用:
<?php
$url = "targetpage"
function redirect$url(){
if (headers_sent()) == false{
echo '<script>window.location.href="' . $url . '";</script>';
}
}
?>
有多种方法可以执行此操作,但是如果您愿意php
,我建议使用该header()
功能。
基本上
$your_target_url = “www.example.com/index.php”;
header(“Location : $your_target_url”);
exit();
如果您想提高它的档次,最好在函数中使用它。这样,您便可以在其中添加身份验证和其他检查元素。
让我们通过检查用户级别来进行尝试。
因此,假设您已经在名为的会话中存储了用户的权限级别u_auth
。
在里面 function.php
<?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
或其他任何页面。
<?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”);
. . .
参考文献;
<?php
header('Location: B.php');
exit();
?>
假设我们要从A.php文件路由到B.php,而不需要借助<button>
或<a>
。让我们看一个例子
<?php
if(isset($_GET['go_to_page_b'])) {
header('Location: B.php');
exit();
}
?>
<p>I am page A</p>
<button name='go_to_page_b'>Page B</button>
B.php
<p> I am Page B</p>
如果您在Apache上运行,则还可以使用.htaccess进行重定向。
Redirect 301 / http://new-site.com/
您可以尝试使用PHP header
函数进行重定向。您将需要设置输出缓冲区,以便您的浏览器不会向屏幕发出重定向警告。
ob_start();
header("Location: " . $website);
ob_end_flush();