0 Пользователей и 1 Гость просматривают эту тему.
  • 54 Ответов
  • 8444 Просмотров
*

alexfom_16

  • Захожу иногда
  • 257
  • 24 / 0
Код
RewriteRule ^раздел/старая_ссылка_на_товар$ https://site.ru/раздел/новая_ссылка_на_товар [L,R=301]

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www [NC,OR]
RewriteCond %{THE_REQUEST} ^GET\ .+?/\ HTTP/
RewriteRule ^(.*?)/?$ https://site.ru/$1 [L,R=301]

А если так?
Так не работает

Вот так все работает :
RewriteRule ^раздел/старая_ссылка_на_товар$ https://site.ru/раздел/новая_ссылка_на_товар [L,R=301]

RewriteCond %{HTTP_HOST} ^www [NC,OR]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://site.ru/$1 [L,R=301]
RewriteRule ^(.*)/$ https://site.ru/$1 [R=301,L]

Огромное Вам СПАСИБИЩЕ!
Рекомендую хостинг Beget.ru
Качественная настройка и ведение Яндекс.Директ.
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Странно, что не работает. У себя на локалке проверил — работает. Если есть возможность написать RewriteRule один раз вместо двух, то эту возможность желательно использовать, потому что нагрузка на сервер существенно снижается. Это касается и перенаправления со старых страниц на новые. Сколько у вас страниц для перенаправления? Может следует написать регулярку? Всё же попробуйте другой вариант:

Код
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www [NC,OR]
RewriteCond %{THE_REQUEST} ^GET\ .+?/\ HTTP/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*?)/?$ https://site.ru/$1 [L,R=301]

Я забыл ещё исключить физические директории — это нужно делать обязательно, иначе швах — всё может накрыться медным тазом:

Код
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*?)/?$ https://site.ru/$1 [L,R=301]

« Последнее редактирование: 27.11.2015, 06:19:05 от Филипп Сорокин »
*

alexfom_16

  • Захожу иногда
  • 257
  • 24 / 0
Так работает
Код
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www [NC,OR]
RewriteCond %{THE_REQUEST} ^GET\ .+?/\ HTTP/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*?)/?$ https://site.ru/$1 [L,R=301]

Старых страниц 550
Рекомендую хостинг Beget.ru
Качественная настройка и ведение Яндекс.Директ.
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Да, дело было в физических директориях. Вам нужно обязательно писать регулярку, или же ваш сервер сдохнет, прошу прощения за такой термин. Могу помочь, если опишете паттерн перенаправления.
*

alexfom_16

  • Захожу иногда
  • 257
  • 24 / 0
Да, был бы Вам очень благодарен, сброшу вам в личку.
Рекомендую хостинг Beget.ru
Качественная настройка и ведение Яндекс.Директ.
*

alexfom_16

  • Захожу иногда
  • 257
  • 24 / 0
Главную не редиректит с http на https и www на без www, внутренние страницы нормально (((
Код
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www [NC,OR]
RewriteCond %{THE_REQUEST} ^GET\ .+?/\ HTTP/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*?)/?$ https://site.ru/$1 [L,R=301]
Рекомендую хостинг Beget.ru
Качественная настройка и ведение Яндекс.Директ.
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Тогда пока так:

Код
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www [NC]
RewriteRule ^(.*)$ https://site.ru/$1 [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*?)/$ https://site.ru/$1 [L,R=301]

Глянул ваши перенаправления: очень сильно изменилась структура каталогов. Чтобы сократить редиректы вашего сайта, на это потребуется много времени. Обычно, подобную работу я делаю платно, если хотите, можем договориться.

Как альтернативный вариант вам придётся использовать Redirect 301 при таком количестве перенаправлений — он работает намного быстрее.
*

alexfom_16

  • Захожу иногда
  • 257
  • 24 / 0
Redirect 301 не подходит, цепочка получается (((
Давайте я Вам завтра напишу и мы договоримся.
Спасибо!
Рекомендую хостинг Beget.ru
Качественная настройка и ведение Яндекс.Директ.
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Последний фол надежды. Грязновато получилось, но может сработать.

Код
Redirect 301 /раздел/старая_ссылка_на_товар https://site.ru/раздел/новая_ссылка_на_товар

RewriteCond %{HTTP_HOST} !^www [NC]
RewriteRule .? - [S=1]

RewriteRule ^(.*)$ https://site.ru/$1 [L,R=301]

RewriteCond %{HTTPS} on
RewriteRule .? - [S=1]

RewriteRule ^(.*)$ https://site.ru/$1 [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*?)/$ /$1 [L,R=301]

Хотя, от редиректов в количестве 550 шт. всё равно надо избавляться.
« Последнее редактирование: 27.11.2015, 04:46:45 от Филипп Сорокин »
*

alexfom_16

  • Захожу иногда
  • 257
  • 24 / 0
Так тоже не работает.
Сделал по-другому, в файле htaccess убрал редирект на https а в настройках Joomla включил ssl, теперь в файле htaccess работает такой редирект:
Redirect 301 /раздел/старая_ссылка_на_товар https://site.ru/раздел/новая_ссылка_на_товар
Рекомендую хостинг Beget.ru
Качественная настройка и ведение Яндекс.Директ.
*

alexfom_16

  • Захожу иногда
  • 257
  • 24 / 0
Пробовал сделать редирект через компонент перенаправления, поставил относительные адреса и также происходит двойной редирект.
Было бы неплохо доработать компонент, чтобы все перенаправления делать там.
Мог бы кто помочь доработать компонент?
Рекомендую хостинг Beget.ru
Качественная настройка и ведение Яндекс.Директ.
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Цитировать
Так тоже не работает.
Странный у вас сервак - у меня всё работает.

Цитировать
Было бы неплохо доработать компонент, чтобы все перенаправления делать там.
Через системный плагин лучше. В .htaccess установить переменную (если сервак поддерживает) и цеплять её в событии onAfterInitialise, чтобы не проверять все 550 адресов. Или просто делать перенаправления при помощи php.
*

draff

  • Гуру
  • 5803
  • 434 / 7
  • ищу работу
Я немного запутался что работает, что не работает.
У меня работает на Joomla 1.5 так
Код
RewriteEngine On
RewriteBase /
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
Если отключаю
Код
#RewriteBase /
не работают директивы редиректа, указанные после этого блока
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
RewriteBase для относительных URL. Его подстановка происходит в самом конце.
*

alexfom_16

  • Захожу иногда
  • 257
  • 24 / 0
Цитировать
Странный у вас сервак - у меня всё работает.
Редирект работает, только при такой конструкции, также получается двойное перенаправление.
Цитировать
Через системный плагин лучше. В .htaccess установить переменную (если сервак поддерживает) и цеплять её в событии onAfterInitialise, чтобы не проверять все 550 адресов. Или просто делать перенаправления при помощи php.
Здесь можно поподробнее? Я так понял, если использовать компонент перенаправления встроенный в Joomla, при обращении к сайту идет проверка в БД на 550 адресов, правильно?
Рекомендую хостинг Beget.ru
Качественная настройка и ведение Яндекс.Директ.
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Редирект работает, только при такой конструкции, также получается двойное перенаправление.

Понятно. Выходит так, что mod_rewrite (RewriteRule) выполняется всегда раньше, чем mod_alias (Redirect), как я и думал. И даже скипы (последний пример) не помагают. В рамках одного единственного .htaccess мы не можем избавиться от двойного перенаправления, если используется и mod_alias, и mod_rewrite. Можно использовать только mod_rewrite, но этот вариант с вашими 550 перенаправлениями будет медленный. Если вы на выделенном сервере, можно попробовать поиграться с Location-ами, но то же самое можно сделать при помощи php и не лезть в конфиг Апача.

Я так понял, если использовать компонент перенаправления встроенный в Joomla, при обращении к сайту идет проверка в БД на 550 адресов, правильно?

Нет, там всё сделано очень гибко. Проверки 550 адресов не происходит — каждой несуществующей странице присвоена новая страница для редиректа. Хотя при помощи самописного плагина редиректы срабатывали бы ещё быстрее.
*

alexfom_16

  • Захожу иногда
  • 257
  • 24 / 0
А если сделать, как я писал выше?
Включить в админке ssl и прописать в .htaccess все 550 редиректов так:
Redirect 301 /раздел/старая_ссылка_на_товар https://site.ru/раздел/новая_ссылка_на_товар
Или 550 перенаправлений в .htaccess это не совсем правильно?
Рекомендую хостинг Beget.ru
Качественная настройка и ведение Яндекс.Директ.
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Redirect (mod_alias) сравнивает строки, там не используются регулярные выражения, поэтому он работает очень быстро. Однако всё же 550 проверок в корневом .htaccess, которые выполняются всегда, при каждом запросе, — многовато. Их можно было бы разбить на группы, что ваша структура каталогов позволяет, но это можно только при помощи php.
*

draff

  • Гуру
  • 5803
  • 434 / 7
  • ищу работу
RewriteBase для относительных URL. Его подстановка происходит в самом конце.

Не всегда. https://htmlweb.ru/php/htaccess-mod_rewrite-rewritebase.php
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
А если сделать, как я писал выше?
Включить в админке ssl и прописать в .htaccess все 550 редиректов так:
Redirect 301 /раздел/старая_ссылка_на_товар https://site.ru/раздел/новая_ссылка_на_товар
Или 550 перенаправлений в .htaccess это не совсем правильно?

Кстати, можно ещё такое попробовать сотворить, если использовать только mod_alias:

Код
<If "%{HTTPS} == 'off' || %{HTTP_HOST} -strcmatch 'www*' || %{REQUEST_URI} -strmatch '*/' && !-d %{REQUEST_FILENAME}">

    # Редиректы старых ссылок
    Redirect 301 /old-url1 https://site.ru/new-url1
    Redirect 301 /old-url2 https://site.ru/new-url2
    Redirect 301 /old-url3 https://site.ru/new-url3

    # Глобальное перенаправление
    RedirectMatch 301 ^(.+?)/*$ https://site.ru$1

</If>
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
*

draff

  • Гуру
  • 5803
  • 434 / 7
  • ищу работу
Где там сказано, что не всегда? Они говорят, что всегда.
Однако на некоторых сайтах URL'ы не прямо соответствуют физическим путям, поэтому вы должны использовать директиву RewriteBase для указания правильного префикса URL.
п.с.
Здесь более развернуто и с примерами
http://stackoverflow.com/questions/21347768/what-does-rewritebase-do-and-how-to-use-it
офф. ман http://httpd.apache.org/docs/current/mod/mod_rewrite.html
RewriteBase Directive Sets the base URL for per-directory rewrites
Хабр давно уже не истина в последней инстанции
« Последнее редактирование: 29.11.2015, 11:16:53 от draff »
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Здесь более развернуто и с примерами
http://stackoverflow.com/questions/21347768/what-does-rewritebase-do-and-how-to-use-it
офф. ман http://httpd.apache.org/docs/current/mod/mod_rewrite.html
RewriteBase Directive Sets the base URL for per-directory rewrites

Да, я это уже читал. Что-нибудь новенького бы! Apache — занятная игрушка, но там ещё очень много серых зон.

Цитировать
Хабр давно уже не истина в последней инстанции

В данном примере я с ними полностью согласен. Неплохо описали механику процесса, хоть и мало, и непонятным слогом местами, но это больше для собственного пиара, чем для "просвещения". Если они, как говорится в статье, учат таким банальным вещам своих сотрудников технической поддержки, то квалификация их сотрудников оставляет желать лучшего. Хотя статья позиционируется для продвинутых.
« Последнее редактирование: 30.11.2015, 00:22:44 от Филипп Сорокин »
*

alexfom_16

  • Захожу иногда
  • 257
  • 24 / 0
Скажите, пожалуйста, можно ли сделать в файле .htaccess условие для "RewriteCond %{HTTPS} off [OR]" при обращении к сайту по http протоколу?
То есть, когда обращаемся по http протоколу, сначала обрабатываем компонент перенаправления и если находим ссылку в нем, компонент сам перенаправляет на новую страницу с прописанным с https протоколом (абсолютной ссылкой), а если не находит, то уже срабатывает перенаправление прописанное в файле .htaccess (RewriteCond %{HTTPS} off [OR] )
Объясню: в компоненте перенаправления ставлю относительную ссылку для старого URL,  для нового пишу абсолютную ссылку с https протоколом и если в файле .htaccess нет "RewriteCond %{HTTPS} off [OR]" то при переходе по старой ссылке компонент перенаправляет сразу на новую ссылку с https протоколом и нет двойной переадресации.
Спасибо!
Рекомендую хостинг Beget.ru
Качественная настройка и ведение Яндекс.Директ.
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Исключительно в htaccess это сделать не получится. Надо либо плагин перенаправления дописывать, либо новый писать. А чем вас не устраивает готовый бюджетный вариант?
 

Кстати, можно ещё такое попробовать сотворить, если использовать только mod_alias:

Код
<If "%{HTTPS} == 'off' || %{HTTP_HOST} -strcmatch 'www*' || %{REQUEST_URI} -strmatch '*/' && !-d %{REQUEST_FILENAME}">

    # Редиректы старых ссылок
    Redirect 301 /old-url1 https://site.ru/new-url1
    Redirect 301 /old-url2 https://site.ru/new-url2
    Redirect 301 /old-url3 https://site.ru/new-url3

    # Глобальное перенаправление
    RedirectMatch 301 ^(.+?)/*$ https://site.ru$1

</If>

Проверки не выполняются для посетителей, которые перемещаются по сайту по https, по самим ссылкам на сайте, а так же при запросах статических ресурсов: изображений, скриптов, стилей и пр. То есть львиную часть нагрузки на сервер мы сняли. Дополнительно, по поводу изменения ядра, это возьмусь делать только платно.
« Последнее редактирование: 30.11.2015, 14:57:12 от Филипп Сорокин »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Редирект для страницы с добавлением кода языка

Автор zeus07

Ответов: 0
Просмотров: 752
Последний ответ 26.06.2023, 11:25:10
от zeus07
Htaccess и редирект с index.php на без index.php

Автор PavelK

Ответов: 2
Просмотров: 2849
Последний ответ 11.05.2023, 14:31:40
от PaLyCH
Как настроить редирект через маску содержащую часть пути?

Автор Slava77

Ответов: 0
Просмотров: 1201
Последний ответ 18.01.2023, 03:17:15
от Slava77
Редирект - исключение из правил (слэш)

Автор darkghost

Ответов: 0
Просмотров: 1214
Последний ответ 26.08.2022, 12:54:19
от darkghost
Редирект - JShop - слеш в конце URL

Автор darkghost

Ответов: 17
Просмотров: 1702
Последний ответ 16.08.2022, 15:18:30
от darkghost