Переписать в .htaccess, чтобы перехватывать файлы, не заканчивающиеся на html - PullRequest
5 голосов
/ 03 марта 2009

Я бы хотел использовать 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'

Очевидно, я что-то упускаю.

Ответы [ 3 ]

7 голосов
/ 03 марта 2009

Используйте директиву RewriteCond, чтобы проверить, не заканчивается ли путь URL-адреса .html:

RewriteCond %{REQUEST_URI} !\.html$
RewriteRule ^(.*[^/])?/?$ $1/index.html [L]

Редактировать Вы используете предварительное утверждение ((?!…)). Но после .* ничего нет (только $). Так что попробуйте вместо этого утверждение:

RewriteRule ^.*$(?<!html) $0/index.html [L]

Но учтите, что вам, вероятно, нужен Apache 2.2, чтобы использовать эти утверждения.

1 голос
/ 03 марта 2009

Почему добавление x заставляет его работать: Если замена будет соответствовать регулярному выражению, RewriteRule будет применен снова. Например, это вызывает ошибку:

RewriteRule ^(.*)$ $1.rb

потому что он заменит script на script.rb. Это соответствует регулярному выражению, поэтому оно заменяет script.rb на script.rb.rb, снова и снова ...

На это намекают в журнале ошибок:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary.

В вашем примере вы добавляете index.html в конец. Если в конце регулярного выражения есть x, то оно не будет соответствовать вашей замене, что заканчивается l.

1 голос
/ 03 марта 2009

Что ж, для того, чтобы заставить его работать, вы можете просто использовать отрицательный взгляд назад вместо взгляда:

RewriteRule ^(.*)(?<!html)$ $1/index.html [L]

Я не уверен, почему добавление 'x' делает его работающим, я отредактирую, если выясню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...