Семантические URL-адреса для статических файлов HTML с .htaccess и mod_rewrite

mod_rewrite всегда ставит меня в тупик... может ли кто-нибудь сказать мне правила, которые мне нужны, чтобы получить следующие чистые URL-адреса? Желаемый URL слева, реальный URL справа.

/our-work/ => /our-work.html
/our-work/some-project/ => /our-work/some-project.html
/contact/ => /contact.html

Как видите, я также хочу принудительно использовать конечные косые черты для всех URL-адресов.

Спасибо!


person Alistair Holt    schedule 14.05.2010    source источник


Ответы (1)


Попробуйте это правило:

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)/$ $1.html [L]

И для добавления завершающих косых черт:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .*[^/]$ %{REQUEST_URI}/ [L,R=301]

Обязательно поместите те правила, которые вызывают внешнее перенаправление (явно с использованием флага R или неявно) перед теми правилами, которые просто вызывают внутреннее перенаправление/перезапись. Итак, в этом случае:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .*[^/]$ %{REQUEST_URI}/ [L,R=301]
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)/$ $1.html [L]
person Gumbo    schedule 14.05.2010
comment
Спасибо. Это работает для примера верхнего уровня /our-work/, но в конечном итоге перенаправляет меня на URL-адреса, такие как /redirect:/our-work/some-project.html.html.html/, когда я нажимаю URL-адреса с двумя уровнями, такими как /our -работа/какой-то проект/. Я также должен сказать, что в данный момент я использую это на URL-адресе локального хоста с указанными портами. - person Alistair Holt; 14.05.2010
comment
Только что протестировано в другой среде, сумасшедший URL-адрес перенаправления был проблемой где-то еще, не знаю, где. Ваше решение идеально, спасибо! - person Alistair Holt; 14.05.2010
comment
@alistair.mp: Ах, ты прав. Я добавил условие, которое проверяет, будет ли перезапись указывать на существующий файл, чтобы избежать бесконечной рекурсии. - person Gumbo; 14.05.2010