ExpressionEngine mod_rewrite Правило для перенаправления URL-адресов с подчеркиванием на тире - PullRequest
0 голосов
/ 23 ноября 2011

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

Например, у меня есть URL, который отформатирован так:

http://example.com/index.php/menu/friday-lunch

Чтобы удалить index.php из URL, я использую следующее правило mod_rewrite:

RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

, которое работает, поскольку я могу просто ввести: http://example.com/menu/friday-lunch

На старом сайте я использовал подчеркивания вместо дефисов для URI страниц, поэтому я написал правило mod_rewrite, чтобы перенаправлять URI с подчеркиваниями, чтобы использовать тире.

Так что friday_lunch становится friday-lunch с помощьюследующий RewriteRule:

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

Это правило работает довольно хорошо, за исключением того, что оно 301 перенаправляет на example.com/index.php/menu/friday-lunch вместо example.com/menu/friday-lunch - обратите внимание на добавление index.php.

Вотвесь .htaccess, которым я сейчас пользуюсь:

<IfModule mod_rewrite.c>
    RewriteEngine On
    # Removes index.php
    RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]
    RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N]
    RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301] 
</IfModule>

Как я могу перенаправить все свои URL с подчеркиванием на эквивалент с тире?

Бонус: что еще хуже, URL, которые приводятна /system, нельзя переписывать дефисом, например: example.com/system/login_in/.

Ответы [ 2 ]

2 голосов
/ 24 ноября 2011

Вот полный набор RewriteRules, который должен делать то, что вам нужно:

<IfModule mod_rewrite.c>
    # Enable Apache's RewriteEngine
    RewriteEngine On

    # Ignore Matching Directories
    RewriteRule ^(images|themes|system) - [L,NC]

    # Replace Underscores with Dashes
    RewriteRule ^([^_]*)_([^_]*)_(.*)$ /$1-$2-$3 [R=301,L]
    RewriteRule ^([^_]*)_(.*)$ /$1-$2 [R=301,L]

    # Remove index.php from ExpressionEngine URLs
    RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>

Чтобы ваши правила mod_rewrite игнорировали папку ExpressionEngine system и не заменяли подчеркивания _ на дефисы - используйте следующее:

RewriteRule ^(images|themes|system) - [L,NC]

Рассечение RewriteRule на простой английский:

  • Флаг - указывает Apache на ничего не делать и , чтобы не переписывать URI
  • Флаги L означают, что это должно быть последним правилом;игнорировать все, что следует за
  • Флаг NC означает отсутствие регистра (так что «Система» или «СИСТЕМА» также совпадают)

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

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


Примечание: Если ваши URL содержат более трех символов подчеркивания, вам нужно добавить еще один RewriteRule поверх существующих для каждого Разделителя слов для заголовков URL , который вы хотите заменить:

RewriteRule ^([^_]*)_([^_]*)_(.*)_(.*)_(.*)$ /$1-$2-$3-$4-$5 [R=301,L]
RewriteRule ^([^_]*)_([^_]*)_(.*)_(.*)$ /$1-$2-$3-$4 [R=301,L]
0 голосов
/ 23 ноября 2011

Вы включили «index.php» в строку замены.

RewriteRule ^(.*)$ index.php/$1 -> RewriteRule ^(.*)$ $1
...