Mod_rewrite: заменить подчеркивания тире
Я раскрываю свое неловкое незнание REGEX-fu здесь, но: у меня в настоящее время есть веб-сайт, где загрузка URL-адресов статей написана как "article_name", а новые - как "имя-статьи",.
Я хочу перенести все их на использование дефиса, так что есть регулярное выражение, которое я мог бы использовать для перезаписи старых URL-адресов в их новые эквиваленты?
Благодарим вас заранее!
Ответы
Ответ 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-адрес...
Предлагается исправить множественные переадресации, имея несколько условий и правил перезаписи с последующим количеством подчеркиваний и токенов, но для этого потребуется столько условий и правил, сколько у вас есть подчеркивания в самом длинном названии.
Обязательно добавьте какие-либо квалификаторы, если вы, однако, можете изменить пути, которые вы не хотите изменять (например, файлы изображений), как есть.