Я бы хотел использовать mod rewrite in для преобразования адресов веб-страниц, таких как / directory в / directory / index.html , в стандартной ситуации размещения LAMP. То, что у меня есть, работает для адресов, которые заканчиваются косой чертой. Я не могу найти способ обработки адресов, которые не заканчиваются косой чертой .
Кажется, что это должно работать:
rewriterule ^(.*)/$ $1/index.html [L] /* addresses ending in / */
rewriterule ^(.*(?!html))$ $1/index.html [L] /* where the problem is */
Но вторая строка вызывает ошибку 500 сервера. Если я добавлю одну букву х во вторую строку:
rewriterule ^(.*)/$ $1/index.html [L]
rewriterule ^(.*x(?!html))$ $1/index.html [L]
Он начинает работать, но только для имен каталогов, заканчивающихся на x . Я пытался заменить х много разных вещей. Что-либо более сложное, чем реальные символы (например, [^ x] или. +), Приводит к ошибке сервера 500.
И, чтобы удовлетворить мое собственное любопытство, кто-нибудь знает, почему добавление одной реальной буквы делает разницу между ошибкой сервера и прекрасно функционирующим правилом?
[Принятый ответ] Благодаря Gumbo я смог приблизить решение с помощью перезаписи секунды:
rewritecond %{REQUEST_URI} !\.[^/]+$
rewriterule (.+) $1/index.html [L]
Это работает, но фильтрует больше, чем просто .html - это может блокировать другие страницы. К сожалению,
rewritecond %{REQUEST_URI} !\.html$
приводит к ошибке сервера:
Запрос превысил 10 внутренних перенаправлений из-за вероятной ошибки конфигурации. Используйте LimitInternalRecursion для увеличения лимита, если это необходимо.
Я все еще хотел бы знать, почему:
rewriterule ^(.*(?!html))$ $1/index.html [L]
приводит к циклу. Первая половина должна проверить, не заканчивается ли в .html. Поскольку вторая половина добавляет .html, это выглядит как функциональный эквивалент:
while(substr($address,-4)!='html') $address.='html'
Очевидно, я что-то упускаю.