#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 до последней минуты.