.htaccess изменить расширение для страниц и забанить оригинал (php->htm)

G
На сайте с 17.08.2011
Offline
94
874

Фактически страницы на сервере - .php с динамической начинкой. Извне они отзываются на .htm. для этого используется Rewrite:

  RewriteRule ^(.*)\.htm$ $1\.php [NC]

Но при таком раскладе получаются дубли страниц:

site.ru/page.php

site.ru/page.htm

Вопрос, как сделать, чтобы остался только один? То есть при вызове page.php напрямую в строке всегда виделся фиктивный page.htm?

[umka]
На сайте с 25.05.2008
Offline
456
#1

Очевидно, добавить редирект с .php на .htm

RewriteRule ^(.+)\.php$ $1\.html [R=301,L]

Лог в помощь!
G
На сайте с 17.08.2011
Offline
94
#2
'[umka:
;12870113']Очевидно, добавить редирект с .php на .htm

Чересчур очевидно. Пройдено. Не работает.

Апач выдает Moved Permanently и линк на сформированный в цикле URL в никуда. Получается-то мы сообщаем, что .php перемещен в .htm, а .htm и есть .php, который перемещен в .htm...

[umka]
На сайте с 25.05.2008
Offline
456
#3

Это происходит потому что вы добавили мой редирект после своего реврайта, в котором у вас нет флага "L".

Т.е. нужно или редирект добавить в начало или добавить в ваше правило флаг "L".

siv1987
На сайте с 02.04.2009
Offline
427
#4

Одного флага L в данном случае будет не достаточно, так как если был произведен реврайт цикл запуститься снова в любом случае, даже если он был остановлен флагом L - last.

Поэтому, в этому случае либо устанавливают дополнительную переменную окружения к реврайту, либо проверяют серверную переменную %{THE_REQUEST}, либо, самый простой способ на мой взгляд, проверять переменную окружения ENV REDIRECT_STATUS которая пуста если не был произведен реврайт.

RewriteCond %{ENV:REDIRECT_STATUS} ^$

RewriteRule ^(.+)\.php$ /$1.html [R=301,L]

Добавлять нужно перед реврайтом, а чтобы не запутаться можно сразу после RewriteEngine On

RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} ^$

RewriteRule ^(.+)\.php$ /$1.html [R=301,L]

RewriteRule ^(.+)\.htm$ $1\.php [NC,L]

G
На сайте с 17.08.2011
Offline
94
#5
siv1987:
самый простой способ на мой взгляд, проверять переменную окружения

Спасибо! Этот вариант работает. 🍻

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