[Ищу] htaccess - внутренний редирект

wwizard

Местный житель
Регистрация
20 Июл 2009
Сообщения
585
Реакции
21
Всем добрый день. Поиском пользовался, похожего вроде нету.

Раннее сайт был на Jumla - теперь на Wordpress версии 4.8 (Шаблон Adwertika).
вследствие чего каталоги стали заканчиваться не на .html, а на слеш. Плюс, некоторые пути изменили свое существование. Как правильно в .htaccess - прописать внутреннюю прелинковку?

Пробовал так, но вроде не заработало:

Код:
RewriteCond %{QUERY_STRING} (manufacturers_id=|cpath=|search_in_description=)
RewriteRule (.+)\/reviews https://site.ru/$1 [R=301,L]
RewriteRule /remont-kotlov.html(.*)$ /uslugi/remont-kotlov/ [R=301,L]
RewriteRule /proektirovanie.html(.*)$ /uslugi/proektirovanie/ [R=301,L]

Может я чего не так понимаю?
 
Последнее редактирование:
Всем добрый день. Поиском пользовался, похожего вроде нету.

Раннее сайт был на Jumla - теперь на Wordpress версии 4.8 (Шаблон Adwertika).
вследствие чего каталоги стали заканчиваться не на .html, а на слеш. Плюс, некоторые пути изменили свое существование. Как правильно в .htaccess - прописать внутреннюю прелинковку?

Пробовал так, но вроде не заработало:



Может я чего не так понимаю?
Чтобы добавить суффикс .html, допишите в .htaccess -
Код:
RewriteRule ^.*/([^/]*)\.html$ /$1 [R=301,L]
 
у меня наоборот, надо уйти с html на слеши
 
А сами ссылки как сделать переход скажем, с:

Код:
мой сайт.ру/о-нас.html  на  сайт.ру/котенок.html
Вот так можно попробовать:
Код:
Options +SymLinksIfOwnerMatch
Redirect 301 /о-нас.html  /котенок.html
 
Последнее редактирование:
Вот так можно попробовать:
Код:
Options +SymLinksIfOwnerMatch
Redirect 301 /о-нас.html  /котенок.html

Прописал так:

Код:
# BEGIN WordPress
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteRule http://gaz.od.ua/o-nas.html(.*) http://site.od.ua/o-nas//$1 [R=301,L]
RewriteRule http://site.od.ua/uslugi.html(.*) http://site.od.ua/uslugi/ [R=301,L]
RewriteRule http://site.od.ua/novosti.html(.*) http://site.od.ua/novosti/ [R=301,L]
RewriteRule http://site.od.ua/remont-kotlov.html(.*) http://site.od.ua/uslugi/remont-kotlov/ [R=301,L]
RewriteRule http://site.od.ua/proektirovanie.html(.*) http://site.od.ua/uslugi/proektirovanie/ [R=301,L]
RewriteRule http://site.od.ua/montazh-oborudovaniya.html(.*) http://site.od.ua/uslugi/montazh-oborudovaniya/ [R=301,L]
RewriteRule http://site.od.ua/teplovizionnye-issledovaniya.html(.*) http://site.od.ua/uslugi/teplovizionnye-issledovaniya/ [R=301,L]
RewriteRule http://site.od.ua/novosti/instruktsii.html(.*) http://site.od.ua/novosti/instruktsii/ [R=301,L]
RewriteRule http://site.od.ua/novosti/opisanie-oborudovaniya.html(.*) http://site.od.ua/category/oborud/ [R=301,L]
RewriteRule http://site.od.ua/novosti/blog.html(.*) http://site.od.ua/category/blog/ [R=301,L]
RewriteRule http://site.od.ua/kontakty.html(.*) http://site.od.ua/kontakty/ [R=301,L]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

<FilesMatch "robots.txt$">
RewriteEngine off
</FilesMatch>

# END WordPress

Ну не работает оно:
Если в браузер засунуть ссылку:
Для просмотра ссылки Войди или Зарегистрируйся

- то вместо перехода, на
Для просмотра ссылки Войди или Зарегистрируйся

- он пишет ошибку:
OOPS !!! 404

Может время должно пройти?
 
ВНИМАНИЕ: все, кто использовал мой редирект до 08.07.2017 включительно - я допустил очень серьезную ошибку!

Правильно будет не:

Код:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm)\ HTTP/
RewriteRule ^(.*)index\.(php|html|htm)$ $1 [R=301,L]

А:

Код:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm)\ HTTP/
RewriteRule ^(.*)index\.(php|html|htm)$ /$1 [R=301,L]

В первом случае запрос отправлялся напрямую через хост и получалась ссылка вида: /var/www/ВАШ-ЛОГИН-НА-ХОСТИНГЕ/data/www/САЙТ. Это очень критично! Шанс взлома при таком раскладе увеличен в разы!

Во втором случае выполняется правильный 301 редирект.

Если Вы когда-либо прочтете данное сообщение вновь, срочно внесите правки =)


Во-первых, чему работа с синтаксисом в .htaccess меня и научила, так это тому, что любые манипуляции с редиректами и прочим обязаны быть в самом начале документа, а не в конце или в средине, и начинаться они должны с "RewriteEngine On".

Почему такое положение?

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

2. В конце идет такой мусор, как список запрещенных ip. И этот список может быть просто зверски огромным! Не будем же мы ставить его в начало?

3. Таким образом, у нас выстраивается жесткая и неизменная веками структура: наши редиректы вверху, синтаксис для CMS посредине, внизу список вредных IP.

Во-вторых, если нужно уйти с .html на "/", то это как нефиг делать:

Код:
RewriteEngine On

#Упразняем .html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

#Прописываем обязательный / на конце
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..{1,10}$
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.site.ru/$1/ [L,R=301]

В третьих, не забываем, что обычная страница вида site.ru/123 генерирует 16 (и это как минимум) дублей.

Код:
site.ru/index.php/material
site.ru/index.php/material.html
site.ru/material
site.ru/material.html
site.ru/index.php/material/
site.ru/index.php/material.html/
site.ru/material/
site.ru/material.html/
www.site.ru/index.php/material
www.site.ru/index.php/material.html
www.site.ru/material
www.site.ru/material.html
www.site.ru/index.php/material/
www.site.ru/index.php/material.html/
www.site.ru/material/
www.site.ru/material.html/
это еще и без .htm, протокола https, точки, на конце доменной зоны (site.ru.) и кучи слешей посреди ссылки (site.ru///material)... Все эти дубли, по сути, не страшны, пока ты не засядешь вплотную за сайт, когда ему стукнет уже лет 5, или пока какой-нибудь "умный" человек не решит дать на твой сайт неправильные ссылки.

Да и вообще, дубли штука страшная. С их помощью можно почти любого конкурента задавить. Но об этом не будем сегодня =)

Устраняем их посредством принудительного отключения www (кто им пользуется?), убираем index.php из ссылки и плюсуем то, что выше.

Код:
RewriteEngine On

#Запрещаем html на конце
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

#Прописываем обязательный / на конце
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..{1,10}$
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.site.ru/$1/ [L,R=301]

#Убираем WWW
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

#Редирект на главную, когда человек намеренно зашел на site.ru/index.(php|html|htm)
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm)\ HTTP/
RewriteRule ^(.*)index\.(php|html|htm)$ /$1 [R=301,L]

#Уничтожаем index.php в ссылках (делаем из site.ru/index.php/material ссылку вида site.ru/material)
RewriteRule ^index.php/(.*)$ http://site.ru/$1 [R=permanent,L]

#В случае, если имеется страница home, закрываем ее, т.к. еще один дубль
Redirect 301 /home http://site.ru/

А вообще, не советую при переезде на другой движок менять структуру ссылок. Однозначно будут просадки по позициям. Я бы лучше оставил .html (тот же, блин, аналог "/"), вырубил "/", и сделал все, начиная с "#Убираем WWW". Выглядеть это будет вот так:

Код:
RewriteEngine On

#Убираем "/"
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.+)/$
RewriteRule ^(.+)/$ /$1 [R=301,L]

#Принудительно ставим .html для любой страницы
RewriteCond %{REQUEST_URI} (.*/[^/.]+)($|\?)
RewriteRule .* %1.html [R=301,L]
RewriteRule ^(.*)/$ /$1.html [R=301,L]

#Запрет на www
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

#Редирект на главную при заходе на site.ru/index.(php|html|htm)
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm)\ HTTP/
RewriteRule ^(.*)index\.(php|html|htm)$ /$1 [R=301,L]

#Уничтожаем index.php в ссылках
RewriteRule ^index.php/(.*)$ http://site.ru/$1 [R=permanent,L]

#В случае, если имеется страница home, закрываем ее, т.к. еще один дубль
Redirect 301 /home http://site.ru/

А сами ссылки как сделать переход скажем, с:

Код:
мой сайт.ру/о-нас.html  на  сайт.ру/котенок.html

Проще некуда! Под кодом (который выше) вставь строчку вида:

Код:
Redirect 301 /stranica1.html http://site.ru/stranica2
Именно в таком формате, а не в том, что ты писал выше. http для первой ссылки не ставится! Никогда! Указывается только /stranica1, а только после указывается полная ссылка, вида
Код:
http://site.od.ua/o-nas/
Иными словами, правильно будет писать так:
Код:
Redirect 301 /o-nas.html http://site.od.ua/o-nas/
А вообще, я приводил пример этой строчки выше, смотри на HOME-правило
 
Последнее редактирование:
Назад
Сверху