Я использую GWTDesigner http://www.instantiations.com/gwtdesigner/, который не свободен, но работает хорошо. Лучший из всех, их поддержка клиентов является высшим качеством - очень быстро реагирующий.
Сначала необходимо добиться единообразия существующих URL-адресов. По сути, вы должны нормализовать все существующие имена, чтобы всегда использовать тире. Хорошо, вы сделали это.
Мы начинаем со следующего предположения:
URL-адрес примерно имеет форму:
http://example.com/articles/what-ever/really-doesnt_matter/faulty_article_name
, где нужно переписывать только URL-адреса в разделе / article
, и только часть / faulty_article_name
требует дезинфекции.
Для Apache:
RewriteEngine On
RewriteRule ^(/?articles/.*/[^/]*?)_([^/]*?_[^/]*)$ $1-$2 [N]
RewriteRule ^(/?articles/.*/[^/]*?)_([^/_]*)$ $1-$2 [R=301]
Это в основном вдохновлено ответом GApple.
Первый /?
гарантирует, что этот код будет работать на обоих виртуальных хостах. и файлы .htaccess
. Последний не ожидает ведущего слэша.
Затем я добавляю часть article /
, чтобы правила применялись только к URL-адресам в пределах / article
.
Затем, пока у нас есть как минимум два символа подчеркивания в URL , мы продолжаем перебирать правила. Когда у нас остается только одно подчеркивание, срабатывает второе правило, заменяет его тире и выполняет постоянное перенаправление.
Фу.
Попробуйте следующее:
RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N]
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301]
Первое правило заменяет одно подчеркивание за раз, пока не останется один или меньше. Последнее правило заменит последнее подчеркивание и выполнит внешнее перенаправление.
Возможный другой подход, о котором следует подумать:
Я предполагаю, что ваш «старый формат» и ваш «новый формат» будут находиться в разных каталогах для этой идеи, если это не так, вы можете подумать о создании нового формата иметь другое имя каталога.
Например:
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
Сопоставление чего-либо с _
и отправка его через перенаправитель.
Внутри перенаправителя.php вы можете получить $ _ SERVER ['REQUEST_URI']
и использовать такие инструменты, как preg_replace и даже запросы к базе данных, чтобы найти правильный URL-адрес для их перенаправления, а также изучить количество обращений к старым URL-адресам.
Как mod rewrite узнает, каким должен быть действительный URL? Вы можете переписать все статьи, используя подчеркивание или тире, но 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
не будут найдены Если вы сохраните все свои статьи последовательно, вы легко сможете заставить работать правило перезаписи. Вместо этого вам, вероятно, придется написать сценарий для проверки существования каталогов и выполнить перенаправление 301 в нужное место.
Вот метод: http://yoast.com/apache-rewrite-dash-underscore/
В основном он разделяет URL-адреса на токены по обе стороны от подчеркивания, и снова перезаписывает токены с замененным подчеркиванием. Проблема в том, что он заменяет только одно подчеркивание за раз; он будет перенаправлять на более близкий, но не совсем правильный URL-адрес, который снова будет перенаправлять на еще более близкий, но, возможно, все еще не правильный URL ...
Он предлагает исправить несколько перенаправлений, имея несколько условий и правил перезаписи с последовательно большим количеством символов подчеркивания и токены, но для этого потребуется столько условий и правил, сколько знаков подчеркивания в вашем самом длинном заголовке.
Не забудьте добавить какие-либо квалификаторы, если можете, так как правило может заменять пути, которые вы не хотите изменять (например, , файлы изображений) как есть.