Проблема замены с помощью htaccess

P
На сайте с 04.08.2008
Offline
15
1154

Делаю подмену по такому правилу:

RewriteRule ^newpage\.html$ /page\.php [L]

Открываются страницы и newpage.html и page.php

Как сделать, чтобы открывалась только newpage.html, а при попадании на страницу page.php, был 301 редирект на newpage.html??

D
На сайте с 29.01.2009
Offline
42
#1

Смотрите RedirectPermanent (модуль mod_alias)

сегодня стал еще беднее
wdsg
На сайте с 09.02.2009
Offline
31
#2

Если вариант, предложенный уважаемым Devider, окажется сложноватым, можно вставить в самое начало page.php примерно такой код:


if (strpos($_SERVER['REQUEST_URI'], 'page.php') !== false) {
header('Location: newpage.html');
};
Проектирование и разработка сложных IT-систем. Вожусь с проблемными задачами.
P
На сайте с 04.08.2008
Offline
15
#3

wdsg, спасибо, код работает, а переправка происходит 301 редиректом?

Можно ли все таки узнать как можно реализовать в mod_rewrite?

wdsg
На сайте с 09.02.2009
Offline
31
#4

peacedate, редирект в приведённом примере выполняется по 302. Для того, чтобы редирект был по 301 необходимо перед header('Location: newpage.html') отправить header('HTTP/1.0 301 Moved Permanently').

Разумеется, задача решаема и с помощью mod_rewrite. Выглядеть это будет примерно так:

RewriteRule ^newpage.html$ page.php [E=FLAG1:1,L]

RewriteCond %{ENV:REDIRECT_FLAG1} !1

RewriteRule ^page.php$ newpage.html [R=301]

P
На сайте с 04.08.2008
Offline
15
#5

wdsg, огромное спасибо, пойду пробовать. Только начал углубленно вникать в htaccess. Мож литературу подскажете, где вникнуть можно?

Superior
На сайте с 20.02.2008
Offline
120
#6

Почитайте это - ссылка.

AS
На сайте с 01.07.2003
Offline
135
#7

RewriteRule ^page\.php$ /newpage\.html [R=301]

RewriteRule ^newpage\.html$ /page\.php [L]

P
На сайте с 04.08.2008
Offline
15
#8

Superior, спасибо за ссылку. Очень хороший материал.

allStars, писал это правило (точнее сам раньше составил) ...

RewriteRule ^page\.php$ /newpage\.html [R=301]
RewriteRule ^newpage\.html$ /page\.php [L]

... не работает! Покраене мере у меня на локалхосте в опере.

Работает правило:

RewriteRule ^newpage.html$ page.php [E=FLAG1:1,L]
RewriteCond %{ENV:REDIRECT_FLAG1} !1
RewriteRule ^page.php$ newpage.html [R=301]

Помогите разобраться, что означает

%{ENV:REDIRECT_FLAG1} !1

и что за флаг [E=FLAG1:1]???

wdsg
На сайте с 09.02.2009
Offline
31
#9

peacedate, конструкция

RewriteRule ^page\.php$ /newpage\.html [R=301]
RewriteRule ^newpage\.html$ /page\.php [L]

не работоспособна изначально, так как содержит взаимоисключающие правила. При page.php мы редиректим на newpage.html, а при newpage.html заменяем его на page.php. Бесконечный цикл имеет место быть.

Для того, чтобы исключить зацикливание, мы, при замене newpage.html на page.php, будем писать в переменную окружения FLAG1 значение 1. Т.е. если окажется, что FLAG1 == 1, можно будет смело сказать, что URL уже гнутый. Установка переменной окружения производится так: [E=имя:значение]. Следовательно, в первой строке конструкции мы проверяем, соответствует ли запрос регулярке ^newpage\.html$. Если соответствует, загибаем на page.php и записываем 1 в FLAG1. Вторая строка является условием, определяющим содержится ли в переменной окружения FLAG1 значение 1. Для простоты восприятия "RewriteCond %{ENV:REDIRECT_FLAG1} !1" можно представить как "if (FLAG1 != 1) {". Третья строка "RewriteRule ^page.php$ newpage.html [R=301] " выполняет 301-ый редирект на newpage.html, если находит ^page\.php$. НО ТОЛЬКО ТОГДА, КОГДА FLAG1 НЕ РАВЕН 1. Т.е. второе правило (третья строка) будет иметь силу только если до этого не сработало первое (первая строка).

Кстати, точки в регулярках необходимо экранировать. Без экранирования они тоже, в принципе, годны, но имеют несколько иное значение. Отсутсвие обр. слешей в моём посте #5 - ошибка по невнимательности. Корректный код:


RewriteRule ^newpage\.html$ page.php [E=FLAG1:1,L]
RewriteCond %{ENV:REDIRECT_FLAG1} !1
RewriteRule ^page\.php$ newpage.html [R=301]

Чуть позже я отправлю Вам в ЛС ссылки на материалы относящиеся к mod_rewrite.

P
На сайте с 04.08.2008
Offline
15
#10

wdsg, СПАСИБО ОГРОМНОЕ за развернутый ответ. В принципе приблизительно так и предполагал, что так правило работает, но с Вашей помощи разобрался совсем. Пока только натыкался на литературу простенькую, где все только в кратце рассказывается. Про точки знаю, поэтому не обратил внимания, всегда их слешем обрабатываю.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий