2010-08-08 57 views
1

我正在开发一个新网站,现有网站仍在运行。我想要做的是在用户访问现有站点(不管他们输入什么页面)时将其重定向到更新页面,然后将他们从该更新页面重定向到他们请求的原始页面。显示更新页面一次

我认为mod_rewrite的规则看起来像

RewriteEngine On 
# redirect to landing page 
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1 // my real IP would go here 
RewriteCond %{REQUEST_URI} !/UpdatePage.html$ [NC] // stop infinite loops on itself 
RewriteRule .* /UpdatePage.html [R=302,L] 

因此上面可以实现从任何页面将用户重定向到更新页。然而,显然这里的问题是它会导致一个连续的循环...

我想我需要某种形式的国旗吗?我对Mod_Rewrite实际上并不是很有经验,可能是这样的吗?或者这是可以在Mod_Rewrite之外用纯PHP实现的东西吗?

+0

嗯,我不确定mod_rewrite,但是当我做了一个更新页面,就像你在做什么的时候,我做了不同的事情。我删除了旧网站上的所有网页,并在index.html下创建了更新页面。然后我把404错误页面与htaccess作为index.html文件。 – Kranu 2010-08-08 23:21:17

回答

1

由于目前网站实现(一切都通过index.php页面)我可以简单地使用一些会话变量,以检测用户是否应被重定向到更新页面或无法如路

<?php 

if (!isset($_SESSION['ShowUpdatePage']) || $_SESSION['ShowUpdatePage'] == "true") 
{ 
    $_SESSION['ShowUpdatePage'] = "false"; 
    header("Location: UpdatePage.html"); 
} 

?> 

这也意味着他们只会在每个会话中重定向一次,这正是我所寻找的。

+0

这是解决这类问题的一个更好的方法。但由于你的问题需要一个htaccess解决方案,我想我会编辑我的答案,并添加更有可能解决问题的东西。 – 2010-08-09 16:51:40

+0

@Stephen - 我不是在寻找使用mod_rewrite唯一的解决办法,如果你看我的文章中,我提到使用*“纯PHP” *藏汉是可能的。但是,您的答案为+1,因为您通过Mod_Rewrite设法执行此操作! – James 2010-08-10 07:44:02

+0

您应该将您的答案标记为解答:-) – 2010-08-10 10:29:55

0

在我看来,这是去它的最好办法:

真正的网站:www.example.org 旧网站:old.example.org 新网站:new.example.org

'新'。域需要事先就位。当您切换站点时,您可以将每个碰到旧站点的人重定向到new.example.org。一段时间,您的用户将拥有“不正确”的域名。几天后,你可以重定向“新”。到“www。”。

2

编辑:我有机会玩我的htaccess文件,我找出了我在下面附加的解决方案。长话短说,虽然它似乎工作,但我不会使用它。

原文:

你可以,如果你已经加入了REDIRECT_STATUS检查重定向尽量不要重定向:

RewriteEngine On 
# redirect to landing page 
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1 // my real IP would go here 

RewriteCond %{ENV:REDIRECT_STATUS} 200 

RewriteCond %{REQUEST_URI} !/UpdatePage.html$ [NC] // stop infinite loops on itself 
RewriteRule .* /UpdatePage.html [R=302,L] 

从我明白这将意味着:重定向到UpdatePage.html如果远程地址是一个特定的IP地址,它以前没有被重定向过。

我无法检查这是否会导致所需的行为,但我确实从这个SO问题的答案中得到了这个结果:Clean URL Redirect Loop

测试的解决方案:

我与我的WAMP的设置发挥各地与此想出了:

RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1 // my real IP would go here 
RewriteCond %{REQUEST_URI} !/UpdatePage.html$ [NC] // stop infinite loops on itself 
RewriteCond %{REQUEST_URI} ^(.+)\.html$ [NC] // Only handle html pages 
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^(.+)\.html$ [NC] //don't redirect if the referer is a page. Should actually include the domain as well 
RewriteRule .* /UpdatePage.html [R=302,L] 

第一次在该网站的任何HTML页面应该重定向到UpdatePage则用户将点击该页面上的链接并转到原始页面。然后设置referer环境变量,您可以检查它是否有效,然后不重定向。

这不处理去网站的根。用户必须直接加载html页面。

我更喜欢你的解决方案(@james)。将逻辑编码到主要网关的顶部PHP页面更简单且不易出错,但我想我会尝试使用htaccess :-)来找到一种方法。请注意,我绝不会使用这个特定的htaccess方法。

+0

我试过了,但似乎没有发生? – James 2010-08-09 07:45:51

+0

+1对于mod_rewrite的具体答案 – James 2010-08-10 07:44:43

相关问题