【问题标题】:Displaying update page once显示一次更新页面
【发布时间】:2010-08-08 23:17:22
【问题描述】:

我正在开发一个新网站,而我的现有网站仍在运行中。我想要做的是在用户访问现有网站时将他们重定向到更新页面(无论他们进入哪个页面),然后将他们从该更新页面重定向到他们请求的原始页面。

我认为 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 实现?

【问题讨论】:

  • 嗯,我不确定 mod_rewrite,但是当我像你正在做的那样制作更新页面时,我做了不同的事情。我删除了旧网站上的所有页面,并在index.html下做了一个更新页面。然后我把带有htaccess的404错误页面作为index.html文件。

标签: php mod-rewrite redirect


【解决方案1】:

编辑:我有机会使用我的 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]

据我了解,这意味着:如果远程地址是某个 IP 地址并且之前没有被重定向,则重定向到 UpdatePage.html。

我无法检查这是否会导致所需的行为,但我确实从这个 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 方法。

【讨论】:

    【解决方案2】:

    由于当前站点的实现方式(一切都通过 index.php 页面),我能够简单地使用一些会话变量来检测是否应该将用户重定向到更新页面,例如

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

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

    【讨论】:

    • 这是解决此类问题的更好方法。但是由于您的问题需要一个 htaccess 解决方案,我想我会编辑我的答案并添加一些更有可能解决问题的内容。
    • @Stephen - 如果您查看我的帖子,我并不仅仅在寻找使用 Mod_Rewrite 的解决方案,我提到是否也可以使用 "pure php"。但是,正如您通过 Mod_Rewrite 设法做到的那样,为您的答案 +1!
    • 您应该将您的答案标记为解决方案 :-)
    • @Stephen - 不能再等 12 小时!认为您需要等待大约 24 小时才能被允许接受自己的答案作为正确答案。
    【解决方案3】:

    在我看来这是最好的方法:

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

    “新”。域需要提前到位。当您切换站点时,您可以将所有访问旧站点的人重定向到 new.example.org。有一段时间,您的用户将拥有“不正确”的域。几天后,您可以重定向“新”。到“www”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 2012-09-16
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多