使用 PHP 进行 301 或 302 重定向
Posted
技术标签:
【中文标题】使用 PHP 进行 301 或 302 重定向【英文标题】:301 or 302 Redirection With PHP 【发布时间】:2012-03-10 22:46:24 【问题描述】:我正在考虑在网站启动阶段使用以下代码向用户显示停机维护页面,同时向我显示网站的其余部分。
有没有办法向搜索引擎显示正确的 302 重定向状态,或者我应该寻找另一种基于 .htaccess
的方法?
$visitor = $_SERVER['REMOTE_ADDR'];
if (preg_match("/192.168.0.1/",$visitor))
header('Location: http://www.yoursite.com/thank-you.html');
else
header('Location: http://www.yoursite.com/home-page.html');
;
【问题讨论】:
记得在这些标题之后exit
你的脚本
【参考方案1】:
对于302 Found
,即临时重定向:
header('Location: http://www.example.com/home-page.html');
// OR: header('Location: http://www.example.com/home-page.html', true, 302);
exit;
如果您需要永久重定向,也就是:301 Moved Permanently
,请执行以下操作:
header('Location: http://www.example.com/home-page.html', true, 301);
exit;
有关更多信息,请查看header function Doc 的 php 手册。另外,使用header('Location: ');
时不要忘记拨打exit;
但是,考虑到您正在进行临时维护(您不希望搜索引擎索引您的页面),建议您返回带有自定义消息的 503 Service Unavailable
(即您不需要任何重定向):
<?php
header("HTTP/1.1 503 Service Unavailable");
header("Status: 503 Service Unavailable");
header("Retry-After: 3600");
?><!DOCTYPE html>
<html>
<head>
<title>Temporarily Unavailable</title>
<meta name="robots" content="none" />
</head>
<body>
Your message here.
</body>
</html>
【讨论】:
语法是void header ( string $string [, bool $replace = true [, int $http_response_code ]] )
- php.net/manual/en/function.header.php
OP 在维护期间要求重定向,在这种情况下,他必须使用 302 进行临时重定向,而不是 301。在 301 又名永久重定向的情况下,浏览器将永远不会尝试该页面,而是转到重定向的页面。
@michaeld 永远不要像测试生产代码一样测试占位符代码。答案中使用的示例 URL 无关紧要——在运行代码之前,您应该始终用自己的已知 URL 替换它。
重点是:我们应该使用 302 重定向客户端,然后发出 503 页面,还是应该设置一个重写规则,直接向每个客户端的请求发出 503 页面?跨度>
【参考方案2】:
以下代码将发出 301 重定向。
header('Location: http://www.example.com/', true, 301);
exit;
【讨论】:
【参考方案3】:我认为从 PHP 或 htaccess 中如何操作并不重要。两者都会完成同样的事情。
我要指出的一件事是,您是否希望搜索引擎在此“维护”阶段开始为您的网站编制索引。如果不是,您可以使用状态码503
(“暂时停机”)。这是一个 htaccess 示例:
RewriteEngine on
RewriteCond %ENV:REDIRECT_STATUS !=503
RewriteCond %REMOTE_HOST ^192\.168\.0\.1
ErrorDocument 503 /redirect-folder/index.html
RewriteRule !^s/redirect-folder$ /redirect-folder [L,R=503]
在 PHP 中:
header('Location: http://www.yoursite.com/redirect-folder/index.html', true, 503);
exit;
使用您当前使用的 PHP 重定向代码,重定向是 302
(默认)。
【讨论】:
我不确定 PHP(或底层服务器,反过来)是否允许 503 状态代码与Location
标头一起通过!事实上,我几乎可以肯定it wouldn't。 (我还隐约记得我在编写代理时也遇到过类似的错误。)您很可能应该使用@dynamic 的示例中也显示的header("HTTP/1.0 503 Service not available");
表单。【参考方案4】:
你检查过你得到的标题吗?因为你应该得到一个302
上面。
来自手册:http://php.net/manual/en/function.header.php
第二种特殊情况是“Location:”标头。它不仅将此标头发送回浏览器,而且还会向浏览器返回一个 REDIRECT (302) 状态码,除非已经设置了 201 或 3xx 状态码。
<?php
header("Location: http://www.example.com/"); /* Redirect browser */
/* Make sure that code below does not get executed when we redirect. */
exit;
?>
【讨论】:
【参考方案5】:来自 PHP documentation:
第二种特殊情况是“Location:”标头。它不仅将此标头发送回浏览器,而且还会向浏览器返回一个 REDIRECT (302) 状态代码,除非已经设置了 201 或 3xx 状态代码。
所以你已经在做正确的事了。
【讨论】:
【参考方案6】:将此文件保存在与 .htaccess 相同的目录中
RewriteEngine on
RewriteBase /
# To show 404 page
ErrorDocument 404 /404.html
# Permanent redirect
Redirect 301 /util/old.html /util/new.php
# Temporary redirect
Redirect 302 /util/old.html /util/new.php
【讨论】:
以上是关于使用 PHP 进行 301 或 302 重定向的主要内容,如果未能解决你的问题,请参考以下文章