Перенаправление. Регулярные выражения
Регулярное выражение представляет собой группу символов, используемых для поиска шаблона внутри фрагмента текста.
В контексте перенаправления простой 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/