Преобразовать в нижний регистр в правиле 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]