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

Тема в разделе "SEO Скрипты", создана пользователем wwizard, 13 июн 2017.

  1. wwizard

    wwizard

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

    Раннее сайт был на 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]
    Может я чего не так понимаю?
     
    Последнее редактирование: 13 июн 2017
  2. diex

    diex Постоялец

    Регистр.:
    21 апр 2013
    Сообщения:
    95
    Симпатии:
    40
    Чтобы добавить суффикс .html, допишите в .htaccess -
    Код:
    RewriteRule ^.*/([^/]*)\.html$ /$1 [R=301,L]
     
  3. wwizard

    wwizard

    Регистр.:
    20 июл 2009
    Сообщения:
    417
    Симпатии:
    12
    у меня наоборот, надо уйти с html на слеши
     
  4. diex

    diex Постоялец

    Регистр.:
    21 апр 2013
    Сообщения:
    95
    Симпатии:
    40
    тогда так
    Код:
    RewriteRule ^(.*)\.html$ /$1 [R=301,L]
     
  5. wwizard

    wwizard

    Регистр.:
    20 июл 2009
    Сообщения:
    417
    Симпатии:
    12
    А сами ссылки как сделать переход скажем, с:

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

    diex Постоялец

    Регистр.:
    21 апр 2013
    Сообщения:
    95
    Симпатии:
    40
    Вот так можно попробовать:
    Код:
    Options +SymLinksIfOwnerMatch
    Redirect 301 /о-нас.html  /котенок.html
    
     
    Последнее редактирование: 13 июн 2017
  7. wwizard

    wwizard

    Регистр.:
    20 июл 2009
    Сообщения:
    417
    Симпатии:
    12
    Прописал так:

    Код:
    # 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

    Может время должно пройти?
     
  8. Risenab

    Risenab Создатель

    Регистр.:
    17 дек 2016
    Сообщения:
    31
    Симпатии:
    18
    Во-первых, чему работа с синтаксисом в .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/
    

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

    Код:
    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-правило
     
    Последнее редактирование: 15 июн 2017