Перенаправление. Регулярные выражения

Регулярное выражение представляет собой группу символов, используемых для поиска шаблона внутри фрагмента текста.

В контексте перенаправления простой URL-адрес соответствует точно одному URL-адресу. URL-адрес регулярного выражения может соответствовать многим URL-адресам.

В дополнение к сопоставлению многих URL-адресов регулярное выражение может извлекать информацию из исходного URL-адреса и копировать его на целевой URL-адрес.

Несколько примеров могут оказаться полезными. Переадресация с исходным URL-адресом /my-url будет соответствовать только запросам /my-url.

Переадресация с исходным URL-адресом /my-url/.* будет соответствовать запросам:

  • /my-url/this
  • /my-url/that

И так далее.

Важная часть /my-url/.* есть .*. Это часть регулярного выражения URL-адреса и эквивалентна выражению «соответствие, /my-url/ за которым следует любая последовательность символов».

Синтаксис регулярного выражения

Таким образом, регулярные выражения, например, .*кажутся действительно полезными. Но что это значит?

В этом случае . означает «любой символ», а * значит — любое число предыдущего выражения. То есть любое количество символов.

Но подождите, это становится намного сложнее!

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

Извлечение исходной информации

Мало того, что регулярное выражение соответствует многим URL-адресам, оно также может извлекать информацию из исходного URL-адреса и копировать ее на целевой URL-адрес.

Почему вы хотите это сделать? Давайте посмотрим на другой пример. Скажите, что у вас есть сайт, на котором находятся некоторые страницы под /oldpage/каталогом, и вы переместили их /newpage/.

  • /oldpage/bananas/
  • /oldpage/best-post-in-the-world/

И вы хотите перенести их на:

  • /newpage/bananas/
  • /newpage/best-post-in-the-world/

То есть, вы хотите изменить , /oldpage/ на /newpage/, но сохранить bananas и best-post-in-the-world.

Для этого вы можете создать регулярное выражение, например /oldpage/(.*).

Обратите внимание, что .* окружены скобками. Это говорит, что перенаправление «захватывает» данные. Тогда нужно указать целевой URL /newpage/$1.

Здесь $1 заменяется содержимым захваченного  (.*). Так что:

/oldpage/bananas => /oldpage/(bananas) => /newpage/$1 =>/newpage/bananas

Бесконечные петли

Часто встречающаяся проблема с регулярным выражением — это бесконечное перенаправление . То есть вы создаете регулярное выражение, которое перенаправляет на URL-адрес, который сам попадает в одно и то же регулярное выражение. Затем это перенаправляется снова и снова и снова, пока браузер не остановится с ERR_TOO_MANY_REDIRECTSсообщением (или эквивалентом).

Например, скажем, у нас есть это перенаправление:

/index.php/(.*) => /portal/index.php/$1

Если вы получите доступ к /index.php/bananaто, он будет перенаправлен на /portal/index.php/banana. Но подождите! Сам URL  /portal/index.php/bananaсовпадает с исходным регулярным выражением в виде  index.php/banana совпадений ./portal/index.php/(.*)

Если мы используем ^ символ carat, мы можем исправить совпадение до начала URL-адреса:

^/oldpage/(.*)

Здесь указано ^ регулярное выражение, которое применяется только при совпадении в начале URL-адреса. Это предотвращает его соответствие в другом месте URL-адреса и останавливает бесконечное перенаправление.

Тестирование регулярных выражений

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

Обратите внимание, что Redirection использует регулярные выражения PHP . Они обычно известны как PCRE и могут быть не такими же, как другие библиотеки регулярных выражений.

Хороший ресурс для понимания регулярных выражений можно найти здесь .

Общие регулярные выражения

Следующие регулярные выражения обычно используются для WordPress:

Перенаправление дня и имени :

Источник: ^/\d{4}/\d{2}/\d{2}/(.*)
Цель:/$1/

Пример: /2017/01/01/thing/=>/thing/

Перенаправить все URL-адреса, /blog/кроме тех, которые начинаются с/blog/ :

Источник: ^/(?!blog)(.*)
Цель:/blog/$1

Пример: /old-post-url/=>/blog/old-post-url/

Перенаправить каждую страницу старого сайта на новый сайт :

Источник: /(.*)
Цель:https://newsite.com/$1/

Пример: http://oldsite.com/your-thing/=>https://newsite.com/your-thing/

Перенаправить .html страницы в каталог :

Источник: /blog/(.*?)\.html
Цель:/$1/

Пример: http://oldsite.com/blog/post-name.html=>https://newsite.com/post-name/

Удалить index.php из URL-адреса

Источник: /index\.php/(.*)
Цель:/$1/

Пример: http://site.com/index.php/post-name.html=>https://site.com/post-name/

источник