Нечувствительные к регистру URL-адреса с mod_rewrite

Я бы хотел, чтобы какой-либо URL-адрес не попал в существующий файл, чтобы просмотреть другие возможные случаи и посмотреть, существуют ли эти файлы, и если да, то 302 им.

Если это невозможно, то я согласен с этими компромиссами:

  • Проверить только строчную версию
  • Проверить только первую часть пути

Например http://example.com/CoOl/PaTH/CaMELcaSE следует перенаправить на http://example.com/CoOl/PaTH/CaMELcaSE (предполагая, что последнее существует).

но, конечно, полное решение гораздо полезнее для меня и других

Ответ 1

CheckSpelling on

Соответствует файлам и каталогам. Подробнее см. В документации.

Ответ 2

У меня нет Apache для тестирования, но некоторая комбинация этих правил должна делать то, что вы хотите:

RewriteEngine on
RewriteMap lower int:tolower
RewriteCond ${lower:%{REQUEST_URI}} -U
RewriteRule [A-Z] ${lower:%{REQUEST_URI}} [R=302,L]
  • Строчная карта для преобразования /SoMeThinG в/something
  • Условие, чтобы увидеть, существует ли нижний регистр REQUEST_URI (-U - внутренний запрос apache)
  • Правило, чтобы на самом деле переписать

Я не знаю, может ли RewriteMap применяться в состоянии или применяется только к правилу. Они основаны на эксперты обменивают принятый ответ и небольшая оранжевая дискуссия форума.

Ваше "идеальное" решение, вероятно, невозможно, если вы не можете перечислить все допустимые страницы вашего сайта. Если у вас есть только несколько действительных страниц, комбинация RewriteMap и текстовая карта будет делать именно то, что вам нужно. Если есть сотни/тысячи страниц, вам может понадобиться написать script и использовать директиву prg.

Если вы не можете идентифицировать каждую действительную страницу, вам нужно попробовать каждый вариант в случае. Рассмотрите свой URL как двоичную строку, с 0 для строчной буквы и 1 для прописных. Просто с вашего простого примера вам придется протестировать 2 ^ 17 вариаций, 128 тыс. Страниц.

Ответ 3

Посмотрите модуль mod_negotiation модуля Apache. Он делает именно то, что вы хотите: http://httpd.apache.org/docs/2.0/mod/mod_negotiation.html#multiviews

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