Сложная проблема с регулярным выражением в PHP - PullRequest
0 голосов
/ 20 января 2010

Может быть, не сложно для некоторых, но сложно для меня.

Я недавно переместил вещи в свой блог, и мне нужно легко перенаправить пользователей на новые страницы.

Ранее все мои статьи были связаны так:

http://www.my -site.com / блог / мой-статья-название

Но я изменил это на:

http://www.my -site.com / блог / статьи / моя-статья-название

Я хочу перенаправить пользователей, посещающих "blog / my-article-title", на "blog / article / my-article-title".

Сложность в том, что у меня есть другие разделы в моем блоге, такие как архивы и поиск, чьи URL-адреса являются «блог / архивы» или «блог / поиск». Как вы, возможно, уже подумали, требуется более разумное решение, поэтому пользователи, ищущие мою страницу архивов, не будут перенаправлены на несуществующую статью под названием «архивы».

Любая помощь?

Ответы [ 3 ]

6 голосов
/ 20 января 2010

Вы хотите использовать mod_rewrite (или эквивалент вашего веб-сервера), а не php для этого.

4 голосов
/ 20 января 2010

Это лучше сделать в вашем файле .htaccess, чем в PHP;и знаменитая цитата Джейми Завински о наличии двух проблем, если использовать в уме пружины регулярных выражений.Вам нужно минимальное регулярное выражение для .htaccess и ни одного вообще для PHP.

RewriteCond $1 !^(archives|search)
RewriteRule blog/(.*) http://www.my-site.com/blog/article/$1 [R=301]

Или, если у вас есть RedirectMatch, вы можете комбинировать его с отрицательным прогнозом, как уже предлагалось:

RedirectMatch permanent blog/((?!archives|search).+) http://www.my-site.com/blog/article/$1

Если вам нужно использовать PHP:

$urlparts = explode('/', $_SERVER['REQUEST_URI']);

if ( ! in_array($urlparts[1], array('archives', 'search')) ) {
    $url = 'http://www.my-site.com/blog/article/' . $urlparts[2]
    header('HTTP/1.1 301 Moved Permanently');
    header("Location: $url");
    exit;
}

Как вы можете видеть, в PHP все гораздо сложнее и требует запуска интерпретатора для выполнения действий, которые мог бы выполнить сервер, поэтому избегайте этого, еслиу вас есть возможность.

0 голосов
/ 20 января 2010

Вы можете использовать отрицательный взгляд, например:

blog/((?!archives|search).+)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...