Отображение страницы обновления один раз - PullRequest
1 голос
/ 09 августа 2010

Я нахожусь в процессе разработки нового веб-сайта, и мой существующий сайт еще работает. Я хочу перенаправить пользователя на страницу обновления, когда он посещает существующий сайт (независимо от того, на какую страницу он заходит), а затем перенаправить его с этой страницы обновления на исходную страницу, которую он запрашивал.

Я думаю, что правило 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?

Ответы [ 3 ]

2 голосов
/ 09 августа 2010

Редактировать: у меня была возможность поиграть с моим файлом 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: Очистить петлю перенаправления URL .

Проверенное решение:

Я поэкспериментировал с настройкой 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-страницена сайте следует перенаправить на страницу обновления, тогда пользователь щелкнет ссылку на этой странице и перейдет на исходную страницу.Затем устанавливается переменная среды referer, и вы можете проверить, является ли она действительной, а затем не перенаправить.

Это не обрабатывает переход к корню веб-сайта.Пользователь должен загружать html-страницу напрямую.

Я очень предпочитаю ваше решение (@james).Кодирование логики в верхней части страницы PHP основного шлюза проще и намного менее подвержено ошибкам, но я решил, что попытаюсь найти способ, используя htaccess :-).Обратите внимание, что я бы никогда не использовал этот метод htaccess самостоятельно.

1 голос
/ 09 августа 2010

Благодаря тому, как реализован текущий сайт (все проходит через страницу index.php), я смог просто использовать некоторые переменные сеанса, чтобы определить, следует ли перенаправить пользователя на страницу обновления или нет, например,

<?php

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

?>

Это также означает, что они будут перенаправляться только один раз за сеанс, и это именно то, что я искал.

0 голосов
/ 09 августа 2010

На мой взгляд, это лучший способ сделать это:

реальный сайт: www.example.org старый сайт: old.example.org новый сайт: new.example.org

«новый».Домен должен быть на месте заранее.Когда вы закрываете сайт, вы можете просто перенаправить всех, кто попал на старый сайт, на new.example.org.Некоторое время ваши пользователи будут иметь «неправильный» домен.Через несколько дней вы можете перенаправить «новый».на "www.".

...