Преобразовать в нижний регистр в правиле mod_rewrite

Я хотел бы, чтобы URL-адреса, такие как server.com/foo, не учитывали регистр. Но server.com/foo фактически получает mod_rewrite'd для server.com/somedir/foo

(Предположим, что все файлы в "somedir" строчные.)

Итак, вопрос в том, как выполнить mod_rewrite следующим образом:

RewriteRule  ^([^/]+)/?$  somedir/convert_to_lowercase($1)

PS: Вот удобная шпаргалка mod_rewrite - http://dreev.es/modrewrite - хотя она не может ответить на этот конкретный вопрос.

PPS: Спасибо Bee и Ignacio Vazquez-Abrams за помощь в этом. Кроме того, вот связанный вопрос: активация RewriteMap

3 ответа

Решение

Сначала поместите следующую строку в <VirtualHost> раздел вашего.conf файла. (Для меня это живет в /etc/httpd/vhosts.d/00foo.conf.)

RewriteMap lc int:tolower 

Вы можете заменить lc с любым именем, которое вы хотите. Затем перезапустите Apache, что вы можете сделать с sudo service httpd restart,

Наконец, добавьте это в ваш файл.htaccess:

RewriteRule ^/(.*)$ /${lc:$1} 
RewriteMap tolower int:tolower
RewriteRule  ^([^/]+)/?$  somedir/${tolower:$1}

Я бы сделал это редиректом 301, а не перезаписью URL, для целей SEO:

RewriteMap tolower int:tolower
RewriteRule  ^([^/]+)/?$  somedir/${tolower:$1} [R=301,L]
Другие вопросы по тегам