使用 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 Docphp 手册。另外,使用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 重定向的主要内容,如果未能解决你的问题,请参考以下文章

PHP 301 重定向,不可能?

php 301 重定向实际上是在执行 302 重定向

http 301 302 303 307 308 傻傻分不清

HTTP 的重定向301,302,303,307(转)

表单提交响应 301 或 302

luaSocket HTTP 请求总是以重定向响应(301 或 302)