2012-02-20 67 views
43

我正在考虑在网站启动阶段使用以下代码,向用户展示维护页面,同时向我展示网站的其余部分。301或302使用PHP重定向

有没有办法向搜索引擎显示正确的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'); 
}; 
+11

记得在这些头文件后退出你的脚本 – Vitamin 2012-02-20 15:43:34

回答

96

对于302 Found,即临时重定向做:

header('Location: http://www.yoursite.com/home-page.html'); 
// OR: header('Location: http://www.yoursite.com/home-page.html', true, 302); 
exit; 

如果你需要一个永久重定向,又名:301 Moved Permanently,做到:

header('Location: http://www.yoursite.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> 
+6

语法是'void header(string $ string [,bool $ replace = true [,int $ http_response_code]]) - http://php.net/manual /en/function.header.php – Vitamin 2012-02-20 15:41:04

+3

OP在维护期间要求重定向,在这种情况下,他必须使用302而不是301来临时重定向。在301又名永久重定向的情况下,浏览器将永远不会尝试该页面,而是转到重定向页面。 – seven 2014-02-11 17:50:45

+0

有没有人会提到这个“yoursite.com”只是让我的防病毒盾报告几个“检测到威胁”?为什么不在你的回答中使用example.com。请帮助我们,并将您的帖子更新到example.com,因为yoursite.com是恶意软件。当我测试你的代码时,它会将我重定向到恶意软件。泰为正确的答案,但认真......修复这个跆拳道。 – 2017-05-10 08:04:53

3

你有没有检查你收到了什么标题?因为你应该得到一个302以上。

从手册:http://php.net/manual/en/function.header.php

第二特例是在 “位置:” 首标。除非已经设置了201或3xx状态码,否则它不仅会将此标题发送回浏览器,还会向浏览器返回REDIRECT(302)状态码。

<?php 
header("Location: http://www.example.com/"); /* Redirect browser */ 

/* Make sure that code below does not get executed when we redirect. */ 
exit; 
?> 
3

从PHP documentation

第二个特殊情况是 “位置:” 头。除非已经设置了201或3xx状态码,否则它不仅会将此标题发送回浏览器,还会向浏览器返回REDIRECT(302)状态码。

所以你已经在做正确的事情。

16

以下代码将发出301重定向。

header('Location: http://www.example.com/', true, 301); 
exit; 
4

我不认为它真的很重要你怎么做,从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(默认)。