Комбинирование или переписывание правил для сложного перенаправления

#wordpress #redirect

#wordpress #перенаправление

Вопрос:

Я неплохо разбираюсь в перезаписи в .htaccess, но эта проблема действительно меня победила.

Недавно я заново создал свой веб-сайт с объявлениями на WordPress, и теперь мне нужно настроить количество перенаправлений 301 в htaccess, чтобы гарантировать, что все проиндексированные страницы не будут потеряны. Проблема в том, что старый веб-сайт использовал структуру домена / каталога следующим образом:

  • /
  • / блог/
  • /связаться/
  • /listingname1/
  • /listingname2/
  • /listingname3/
  • /listingname1999/

Где ‘listingname’ может быть чем-то вроде ‘toms-hardware’ или ‘the-bakery’ и т. Д.

Новый веб-сайт находится на WordPress и использует тему листинга, в которой домен и структура домена / каталога выглядит следующим образом:

  • /
  • / блог/
  • /связаться/
  • /my/listing/listingname1/
  • /my/listing/listingname2/
  • /my/listing/listingname3/
  • /my/listing/listingname1999/

В двух словах, корень остается одинаковым для обоих сайтов, как и страницы блога и контактов (и одна или две другие главные страницы). Однако каждая из страниц со списком перенаправляет на страницу каталога / списка, как показано выше. Обычно это было бы просто, но поскольку URL-адрес исходного списка находится вне корня на старом сайте и поскольку нет шаблона для идентификации имени списка; и поскольку списков так много, это должно быть сделано с использованием какого-либо шаблона регулярных выражений для этих элементов в корне. Правила должны работать над исключением всего, что не изменяется, а затем перенаправлять все остальное из корня в новую структуру каталогов списка.

Я пробовал несколько разных подходов для сопоставления старого с новым, но они просто не будут работать для всего. Вот что я попробовал:

 RewriteCond %{REQUEST_URI} !^/$ [NC]
RewriteCond %{REQUEST_URI} !^/blog.* [NC]
RewriteCond %{REQUEST_URI} !^/contact.* [NC]
RewriteCond %{REQUEST_URI} !^/my.* [NC]
RewriteRule ^(.*) https://example.com/my/listing/$1/ [L,R=301]
  

Я думаю, может быть, я не понимаю использования RewriteCond, когда есть критерий not (!). Если кто-нибудь может помочь и показать, где я ошибся, или добавить какие-либо предложения, это будет высоко оценено.

Ответ №1:

Ключом к этой проблеме является использование начальных и конечных символов регулярных выражений для точного определения части URI, на которую вы хотите настроить таргетинг. Вот пошаговая информация о том, что вам может понадобиться:

Включите механизм перезаписи и установите DocumentRoot в качестве пути для относительных URL-адресов:

 RewriteEngine on
RewriteBase /
  

Исключите корневой каталог, чтобы домашняя страница продолжала работать

 RewriteCond %{REQUEST_URI} !^/$ [NC]
  

Поскольку вы используете WordPress, исключите все страницы администратора / панели мониторинга

 RewriteCond %{REQUEST_URI} !^/wp-content/.*$ [NC]
RewriteCond %{REQUEST_URI} !^/wp-admin/.*$ [NC]
  

Исключить страницу блога

 RewriteCond %{REQUEST_URI} !^/blog/$ [NC]
  

Теперь ключевое условие перезаписи — проверьте, есть ли какие-либо страницы с одним именем каталога и ничего после этого (обратите внимание на использование начальных символов регулярного выражения ‘^’ и конечных символов регулярного выражения ‘$’) и регулярного выражения для выбора одного или нескольких буквенно-цифровых символов и ‘-‘ или ‘_’.

 RewriteCond %{REQUEST_URI} ^/[a-zA-Z0-9_-] /$ [NC]
  

Этот критерий будет справедлив для https://example.com/listingname1 / но не для https://example.com/listingname1/abc .

Наконец, определите RewriteRule как

 RewriteRule ^([a-zA-Z0-9_-]*)/$ https://example.com/my/listing/$1/ [L,R]
  

Несколько моментов, о которых следует знать, в начале RewriteRule нет ‘/’, и вам не нужно условие для исключения страниц ‘my / listing’, потому что они не соответствуют условию # 5 и поэтому не будут перенаправлены.

Собрать все это вместе:

 RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^/$ [NC]
RewriteCond %{REQUEST_URI} !^/wp-content/.*$ [NC]
RewriteCond %{REQUEST_URI} !^/wp-admin/.*$ [NC]
RewriteCond %{REQUEST_URI} !^/blog/$ [NC]
RewriteCond %{REQUEST_URI} ^/[a-zA-Z0-9_-] /$ [NC]
RewriteRule ^([a-zA-Z0-9_-]*)/$ https://example.com/my/listing/$1/ [L,R]
  

Если у вас есть другие страницы отдельного каталога, которые вы хотите исключить (и, вероятно, будут и другие), включите их в качестве условий перезаписи следующим образом:

 #RewriteCond %{REQUEST_URI} !^/other/.*$ [NC]
  

Также не забудьте не включать флаг перезаписи [R = 301] во время тестирования, потому что ваш браузер будет кэшировать результат, и вам нужно будет постоянно очищать кэш браузера между тестами. Я предлагаю вам просто использовать [R], пока вы не проверите, что правила работают, а затем добавьте ‘= 301’ непосредственно перед запуском.

Комментарии:

1. Спасибо — у меня все отлично сработало! Также спасибо за замечательный совет о том, чтобы оставить определение перенаправления 301 до последней минуты.