Вопрос к сведущим в mod_rewrite

U
На сайте с 19.03.2006
Offline
101
Utr
555

Помогите решить проблему, пожалуйста.

Есть множество файлов вида nekotoryj-fail.htm, которые лежат в определенной директории типа http://moysait.ru/papka/. Возможно ли создать правило, которое бы обеспечило показ файлов с тем же именем из этой директории, но при обращении к корню (с использованием 301 редиректа)?

То есть:

При обращении к

http://moysait.ru/nekotoryj-fail.htm

должен показываться файл, который на самом деле имеет адрес:

http://moysait.ru/papka/nekotoryj-fail.htm

и при этом редиректиться 301 редиректом, чтобы не было дубля для ПС.

Записи по отдельности не проходят, т.к. файлов тысячи.

J
На сайте с 20.02.2014
Offline
120
jkm
#1
Utr:

При обращении к
http://moysait.ru/nekotoryj-fail.htm
должен показываться файл, который на самом деле имеет адрес:
http://moysait.ru/papka/nekotoryj-fail.htm
и при этом редиректиться 301 редиректом, чтобы не было дубля для ПС.
Записи по отдельности не проходят, т.к. файлов тысячи.

RewriteCond %{DOCUMENT_ROOT}/papka%{REQUEST_URI} -f

RewriteRule ^ /papka%{REQUEST_URI} [L,R=301]

U
На сайте с 19.03.2006
Offline
101
Utr
#2

Не прокатило:(

Собственно реврайт на http://moysait.ru/nekotoryj-fail.htm имеет место, но отдаётся ошибка 404.

J
На сайте с 20.02.2014
Offline
120
jkm
#3

Т.е при обращении к http://moysait.ru/nekotoryj-fail.htm возвращается не 301 а ошибка 404,

а страница http://moysait.ru/papka/nekotoryj-fail.htm возвращает 200 ?

Тогда вероятно nginx самостоятельно отдает .htm не передавая запрос apache.

IL
На сайте с 20.04.2007
Offline
435
#4
Utr:
Записи по отдельности не проходят, т.к. файлов тысячи.

Почему не проходят? Делается "волшебный" файлик, который обрабатывает адрес (REQUEST_URI) и либо нужный файл отдаёт, либо 404 (или дальше, управление CMS передаёт)

p.s. изначально понял "так", чтобы по адресу http://moysait.ru/nekotoryj-fail.htm открывался файл без редиректа, а редирект был из каталога papka (для исключения дублей) в корень. Иначе подошла бы более простая формулировка - "просто" редирект из корня в подкаталог.


RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule papka/(.*) /$1 [R=301,L]
RewriteCond %{DOCUMENT_ROOT}/papka%{REQUEST_URI} -f
RewriteRule . /papka%{REQUEST_URI} [L]

p.p.s. если nginx-а нет, проверьте остальные правила - возможно поместили не туда или же другими правилами "перекрываются"

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
U
На сайте с 19.03.2006
Offline
101
Utr
#5

jkm,

страница http://moysait.ru/papka/nekotoryj-fail.htm

успешно редиректит на http://moysait.ru/nekotoryj-fail.htm, которая уже отдаёт 404.

ivan-lev,

попробовал Вашу запись:

RewriteCond %{ENV:REDIRECT_STATUS} ^$

RewriteRule papka/(.*) /$1 [R=301,L]
RewriteCond %{DOCUMENT_ROOT}/papka%{REQUEST_URI} -f
RewriteRule . /papka%{REQUEST_URI} [L]

- та же самая история.

Насчёт других правил - вот что, собственно, имеется в исходном .htaccess:

AddDefaultCharset utf-8

Options -Indexes

RewriteEngine On
RewriteBase /
RewriteRule ^.htaccess$ - [F]

RewriteCond %{REQUEST_URI} !\.(ico|css|js|txt)$ [NC]
RewriteCond %{REQUEST_FILENAME} !^/admin
RewriteCond %{REQUEST_FILENAME} !^/migrate
RewriteCond %{REQUEST_FILENAME} !^/install
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ /index.php [L]

А вообще, смысл задачи в том, что старый статический сайт сейчас переносится на CMS. А сайт этот был устроен так, что тысячи страниц лежали у него в корне. И сейчас надо куда-то их аккуратно пристроить и правильно показывать ПС - поскольку они неплохо отранжированы и с них идёт трафик.

Решение видел в том, чтобы собрать их все в одну папку и с помощью mod_rewrite показывать их находящимися в корне, как и раньше. Но... пока не работает.

siv1987
На сайте с 02.04.2009
Offline
427
#6
Utr:
ivan-lev,
попробовал Вашу запись:

- та же самая история.

Отлично работает. Добавлять нужно после RewriteEngine On и сбросить кеш браузера. Также сказали про сервер nginx, который может сам обрабатывать статику

IL
На сайте с 20.04.2007
Offline
435
#7
Utr:
и с помощью mod_rewrite показывать их находящимися в корне, как и раньше. Но... пока не работает.

ОК, т.е. предположение было верным.

Тогда вставляйте код парой постов выше сразу после строчки

RewriteRule ^.htaccess$ - [F]

Если не сработает - создать файлик test.php (со словом Test) в папке и обратиться к site.ru/test.php (в корне)

p.s. ИМХО, правильнее показывать их в каталоге, а со старых адресов 301 редирект сделать.

U
На сайте с 19.03.2006
Offline
101
Utr
#8

Огромное спасибо ivan-lev и другим участникам обсуждения.

Всё заработало как надо.

---------- Добавлено 21.02.2014 в 15:59 ----------

p.s. ИМХО, правильнее показывать их в каталоге, а со старых адресов 301 редирект сделать.

А такой вариант каким правилом можно организовать?

IL
На сайте с 20.04.2007
Offline
435
#9
Utr:
А такой вариант каким правилом можно организовать?

Вот этим: /ru/forum/839036

U
На сайте с 19.03.2006
Offline
101
Utr
#10

Большое спасибо:)

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