Нужна помощь с редиректом в .htaccess после удаления компонента

01K

Разрушитель (V)
Сообщения
65
Симпатии
50
Баллы
1 434
Всем привет!
Поменялась структура сайта, удалён DJ Catalog с продуктами и категориями.

Подобрал правило с 301-ым редиректом, которое должно перенаправлять всё после второго "/"

Код:
RewriteRule ^(old-category/). /new-cat/new-subcat [R=301,L]

Появляется "петля", браузер пишет `The page isn’t redirecting properly error`, в логах всплывает ошибка Redirect to non-URL error


Но если я уберу "new-subcat", то перенаправление работает и ведёт на "/new-cat":

Код:
RewriteRule ^(old-category/). /new-cat [R=301,L]
 
Проблема с вашим правилом возникает из-за того, что вы используете точку после первой группы захвата. Когда вы используете точку, это означает "любой символ", поэтому в вашем правиле точка захватывает все символы после первой косой черты, включая слэши и другие символы пути.

Чтобы исправить эту проблему, замените точку на конкретный путь, который вы хотите перенаправить. Например, если вы хотите перенаправить все запросы, которые начинаются с /old-category/, на /new-cat/new-subcat/, то ваше правило должно выглядеть так:

Код:
RewriteRule ^old-category/(.*)$ /new-cat/new-subcat/$1 [R=301,L]

В этом правиле мы используем (.*), чтобы захватить все символы после /old-category/, а затем добавляем $1 в конец перенаправляемого пути, чтобы включить захваченные символы.
 
  • Мне нравится
Симпатии: 01K
Спасибо за ответ!
что-то не пашет :grin:
Вот, например, есть такая старая ссылка:
Код:
https://site.com/brick-and-stoves/9-stove-with-glass?order=category&dir=desc
и надо её перенаправить сюда:
Код:
https://site.com/brick-and-stoves/stoves-service-offers

После
Код:
RewriteRule ^brick-and-stoves/(.*)$ /bricks-and-stoves/stoves-service-offers/$1 [R=301,L]
Браузер ловит петлю, URL выглядит так:
Код:
https://site.com/brick-and-stoves
/stoves-service-offers
/stoves-service-offers/stoves-service-offers
/stoves-service-offers/stoves-service-offers/stoves-service-offers/stoves-service-offers
/stoves-service-offers/stoves-service-offers/stoves-service-offers/stoves-service-offers
/stoves-service-offers/stoves-service-offers/stoves-service-offers/stoves-service-offers
/stoves-service-offers/stoves-service-offers/stoves-service-offers/stoves-service-offers
/stoves-service-offers
/9-stove-with-glass?order=category&dir=desc

ещё не хватает какого-то параметра в .htaccess?
 
Вот, например, есть такая старая ссылка:
Код:
https://site.com/brick-and-stoves/9-stove-with-glass?order=category&dir=desc
и надо её перенаправить сюда:
Код:
https://site.com/brick-and-stoves/stoves-service-offers

Так пробуй:

Скрытое содержимое. Вам нужно войти или зарегистрироваться.

Да, возможно проблема заключается в том, что у вас другие правила перенаправления в .htaccess, которые могут влиять на работу данного правила. Попробуйте добавить флаг [L] (last) к вашему правилу, чтобы оно было выполнено последним:

Также убедитесь, что у вас нет других правил, которые могут конфликтовать с этим правилом или приводить к петле перенаправления. Если проблема остается, пожалуйста, поделитесь полным содержимым вашего файла .htaccess, чтобы я мог посмотреть на него и дать более точный ответ.
 
Последнее редактирование:
  • Мне нравится
Симпатии: 01K
Спасибо!
Так работает!
Добавил ниже в htaccess ещё парочку схожих редиректов на такой, как пример (https://site.com/brick-and-stoves/2-straight-glass?cm=0&f_power_kw=23) адрес:
Код:
RewriteCond %{REQUEST_URI} ^/brick-and-stoves/2-straight-glass$
RewriteRule ^(.*)$ /brick-and-stoves/zidiniu-ir-krosneliu-pardavimas? [R=301,L]

Но, как понимаю, параметры после "?" тоже надо учитывать в правиле редиректа?
И к большинству старых адресов писать вручную каждый редирект?
 
Да, параметры после "?" следует учитывать в правиле редиректа, чтобы они были сохранены при перенаправлении. Вы можете использовать переменную %QUERY_STRING для получения параметров запроса. Например, в вашем случае, вы можете использовать следующий код в htaccess, чтобы сохранить параметры запроса при редиректе:

Скрытое содержимое. Вам нужно войти или зарегистрироваться.

Этот код добавляет переменную %QUERY_STRING в конец нового URL для сохранения параметров запроса при редиректе.

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

Например, если у вас есть страницы с URL https://site.com/brick-and-stoves/1-straight-glass, https://site.com/brick-and-stoves/2-straight-glass, https://site.com/brick-and-stoves/3-straight-glass и т.д., вы можете использовать следующий код в htaccess, чтобы создать общее правило редиректа для всех этих страниц:

Скрытое содержимое. Вам нужно войти или зарегистрироваться.

Этот код использует регулярное выражение ([0-9]+), чтобы захватывать любую цифру после /brick-and-stoves/ и перед -straight-glass в URL. Затем он использует эту цифру в новом URL после /brick-and-stoves/ и перед /zidiniu-ir-krosneliu-pardavimas. В конце он добавляет переменную %QUERY_STRING, чтобы сохранить параметры запроса.

Чего то тупонул, а плагин редиректа для Joomla, не рассматривал?
К примеру SH404SEF
 
Последнее редактирование:
  • Мне нравится
Симпатии: 01K
Благодарю за столь обширный ответ!
Ппопробую всё переделать у себя
 
sh404SEF, как-то не обращал на него внимания. Хороший вариант.
Спасибо!
 
Назад
Верх