Подтвердить что ты не робот

Mod_rewrite: заменить подчеркивания тире

Я раскрываю свое неловкое незнание REGEX-fu здесь, но: у меня в настоящее время есть веб-сайт, где загрузка URL-адресов статей написана как "article_name", а новые - как "имя-статьи",.

Я хочу перенести все их на использование дефиса, так что есть регулярное выражение, которое я мог бы использовать для перезаписи старых URL-адресов в их новые эквиваленты?

Благодарим вас заранее!

4b9b3361

Ответ 1

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

Мы начинаем со следующего предположения:

URL-адрес имеет примерно форму:

http://example.com/articles/what-ever/really-doesnt_matter/faulty_article_name

где должны быть перезаписаны только URL-адреса под /articles, и только часть /faulty_article_name должна быть дезинфицирована.

Значительно обновлено, что-то действительно работает

Для Apache:

RewriteEngine     On
RewriteRule       ^(/?articles/.*/[^/]*?)_([^/]*?_[^/]*)$ $1-$2 [N]
RewriteRule       ^(/?articles/.*/[^/]*?)_([^/_]*)$       $1-$2 [R=301]

Это в целом вдохновлено ответом GApple.

Первый /? гарантирует, что этот код будет работать как в файлах vhost confs, так и .htaccess. Последний не ожидает ведущей косой черты.

Затем я добавляю часть articles/, чтобы гарантировать, что правила применяются только для URL-адресов в пределах /articles.

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

Уф.

Ответ 2

Попробуйте следующее:

RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N]
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301]

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

Ответ 3

Потенциальный подход к размышлению:

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

Например:

http://site.com/articles/2008/12/31/new_years_celebration
http://site.com/article/2008/12/31/new-years-celebration

В этом случае вы можете использовать mod_rewrite для обнаружения чего-либо в "старом каталоге" и перенаправить его на "redirector.php".

Хотя, подумав, ваш mod_rewrite может искать что-то вроде этого:

RedirectRule /articles/(.*_.*)  /redirector.php?article=$1

Согласование всего с _ и отправка его через перенаправитель.

Внутри redirector.php вы можете получить $_SERVER['REQUEST_URI'] и использовать такие инструменты, как preg_replace и даже запросы к базе данных, чтобы найти правильный URL-адрес для их перенаправления, а также изучить количество обращений к старым URL-адресам.

Ответ 4

Как изменится мода на то, что должно быть на самом деле? Вы можете переписать все статьи, чтобы использовать подчеркивание или тире, но нет способа mod_rewrite определить, существует ли новое местоположение.

Например,

/I_Like_Bees      is stored as   /path/i_like_bees
/I-like-flowers   is stored as   /path/i-like-flowers

Вы хотите, чтобы i-like-bees переписал i_like_bees.

  • Если вы переписываете символы подчеркивания в тире, i_like_bees не будет найден
  • если вы переписываете тире для подчеркивания i-like-flowers не будет найдено

Если вы сохранили все свои статьи последовательно, вы могли бы легко создать правило перезаписи. Вместо этого вам, вероятно, придется написать script, чтобы проверить существование каталогов и перенаправить 301 на нужное место.

Ответ 5

Здесь метод: http://yoast.com/apache-rewrite-dash-underscore/

В основном он отделяет URL-адрес в токенах по обе стороны от подчеркивания и снова перезаписывает токены с заменой подчеркивания. Проблема в том, что он заменяет только одно подчеркивание за раз; он будет перенаправляться на более близкий, но не совсем правильный URL-адрес, который снова перенаправится на еще более близкий, но, возможно, еще не правильный URL-адрес...

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

Обязательно добавьте какие-либо квалификаторы, если вы, однако, можете изменить пути, которые вы не хотите изменять (например, файлы изображений), как есть.