Выполнение двух типов замены в .htaccess

Рассмотрим файл .htaccess , который должен преобразовать все символы подчеркивания в тире и заменить потенциальный суффикс .html косой чертой в имени файла.

Пример URL от клиента: http://foo.com/a_b/c_d.html
Пример URL для перенаправления: http://foo.com/ab/cd/

Я использовал этот правило замены суффикса .html :

RewriteRule ^(.*)\.html$ $1/ [R,L]

Я нашел этот потрясающий пост serverfault.SE для переписывания подчеркивания:

RewriteRule ^(.*)_(.*)_(.*)_(.*)$ /$1-$2-$3-$4 [R,L]
RewriteRule ^(.*)_(.*)_(.*)$ /$1-$2-$3 [R,L]
RewriteRule ^(.*)_(.*)$ /$1-$2 [R,L]

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

Это означает, что следующий код заменит только суффикс .html :

RewriteRule ^(.*)\.html$ $1/ [R,L]
RewriteRule ^(.*)_(.*)_(.*)_(.*)$ /$1-$2-$3-$4 [R,L]
RewriteRule ^(.*)_(.*)_(.*)$ /$1-$2-$3 [R,L]
RewriteRule ^(.*)_(.*)$ /$1-$2 [R,L]

И следующий код заменит только символы подчеркивания :

RewriteRule ^(.*)_(.*)_(.*)_(.*)$ /$1-$2-$3-$4 [R,L]
RewriteRule ^(.*)_(.*)_(.*)$ /$1-$2-$3 [R,L]
RewriteRule ^(.*)_(.*)$ /$1-$2 [R,L]
RewriteRule ^(.*)\.html$ $1/ [R,L]

Как следует настроить .htaccess для замены суффикса .html и подчеркивания?

1
задан 8 May 2018 в 16:15
1 ответ

Как упоминалось в комментариях, опубликованные вами директивы уже должны достичь того, что вам нужно, хотя и в двух отдельных перенаправлениях. Вам ничего не нужно делать, чтобы включить такое поведение в .htaccess - именно так оно и работает.

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

Однако вы можете комбинировать эти два перенаправления, так что будет только одно перенаправление. Например:

RewriteRule ^(.*)_(.*)_(.*)_(.*?)(?:/|\.html)?$ /$1-$2-$3-$4/ [R,L]
RewriteRule ^(.*)_(.*)_(.*?)(?:/|\.html)?$ /$1-$2-$3/ [R,L]
RewriteRule ^(.*)_(.*?)(?:/|\.html)?$ /$1-$2/ [R,L]

Здесь обрабатываются как URL-адреса, заканчивающиеся косой чертой, так и URL-адреса, которые не заканчиваются (если не указано расширение .html ), как указано в комментариях. Завершающая косая черта всегда включается в замену .

Дополнительные примечания:

(. *?) - ? в последней захваченной группе делает регулярное выражение не жадный. Это необходимо, чтобы не захватывать завершающую косую черту или расширение .html (если есть). Это оставлено для группы без захвата, которая следует за ...

(?: / | \ .Html)? - Это группа без захвата (?: ), которая является необязательный (завершающий ? ). При использовании чередования он соответствует либо завершающей косой черте, либо завершающему .html расширению, либо вообще ничему.

1
ответ дан 3 December 2019 в 23:17

Теги

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