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

Я использую GWTDesigner http://www.instantiations.com/gwtdesigner/, который не свободен, но работает хорошо. Лучший из всех, их поддержка клиентов является высшим качеством - очень быстро реагирующий.

20
задан Keith Williams 14 August 2009 в 19:17
поделиться

5 ответов

Сначала необходимо добиться единообразия существующих 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 , мы продолжаем перебирать правила. Когда у нас остается только одно подчеркивание, срабатывает второе правило, заменяет его тире и выполняет постоянное перенаправление.

Фу.

23
ответ дан 29 November 2019 в 23:52
поделиться

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

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

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

14
ответ дан 29 November 2019 в 23:52
поделиться

Возможный другой подход, о котором следует подумать:

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

Например:

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-адресам.

2
ответ дан 29 November 2019 в 23:52
поделиться

Как 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 в нужное место.

1
ответ дан 29 November 2019 в 23:52
поделиться

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

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

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

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

0
ответ дан 29 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: