Конечный слеш - PullRequest
       10

Конечный слеш

2 голосов
/ 12 июня 2009

Как добавить косую черту в:

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css|html)$ index.php

Я пробовал с:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+[^/])$ $1/ [R]

Но это не работает

Ответы [ 2 ]

3 голосов
/ 20 августа 2011

См. Строку сведений / описания для CondPatterns -d и -f для RewriteCond . Посмотрите, как там написано «проверяет, существует ли он и является ли он обычным файлом»? Это дорого и плохо масштабируется. Вы действительно волнуетесь, если это "обычный файл"? Нет, вас волнует только, если выглядит как файл. (соответствует шаблону filename.extension) Итак, я собираюсь улучшить ваш Rewrite, пока я в нем.

См. Подробности / описание флага 'last | L' для RewriteRule . Видите, как там написано "не применять больше правил переписывания"? Могу поспорить, это то, что вы хотите, не так ли? Вы хотите, чтобы либо index.php использовался, когда запрос не соответствует расширению статического актива, ИЛИ вы хотите поставить косую черту в конце запроса, который не не соответствует шаблону filename.extension. Не оба.

Вот как вы это делаете:

# turn on matching
RewriteEngine on

# 1st rule block. If any of the conditions don't apply skip over this block to the next.
# condition: uri ends with filename.extension
RewriteCond %{REQUEST_URI}  [^/.]+\.[^/.]+$
# condition: uri doesn't end with a desired extension
RewriteCond %{REQUEST_URI}  !\.(js|ico|gif|jpg|png|css|html)$ [NC]
# rewrite the request to be for index.php and don't apply any more rules
RewriteRule -  index.php [L]

# 2nd rule block. If any of the conditions don't apply skip over this block to the next.
# condition: uri doesn't end with a slash
RewriteCond %{REQUEST_URI}  !/$
# condition: uri doesn't end with filename.extension
RewriteCond %{REQUEST_URI}  !/[^/]+\.[^/.]+$
# rewrite the request to be appended with a slash
RewriteRule (.*)  $1/ [R=301]

Это очень хороший ответ, учитывая, что вы не сказали нам, что вы хотите сделать. Если вы хотите получить лучший ответ, вам нужно дать нам больше информации, чем «Я скопировал и вставил 2 фрагмента кода вместе, но это не работает».


Обновление: Я поспешно набросал правку этого ответа, основываясь на ответе Корнегигуила. Вот расшифровка стенограммы bash, которую я сделал, чтобы проверить это. Дайте мне знать, если увидите ошибку.

#bruno:~$ (
for str in asdf asdf.css asdf.min.css; do
    echo -e "\n## $str ##"
    echo /brunobronosky1/$str | grep -E '/[^/.]+\.[^/.]+$' || echo '[no match]'
    echo /brunobronosky2/$str | grep -E '/[^/]+\.[^/.]+$' || echo '[no match]'
    echo /cornegigouille/$str | grep -E '/[^/.]+(\.[^/.]+)+$' || echo '[no match]'
done
)

## asdf ##
[no match]
[no match]
[no match]

## asdf.css ##
/brunobronosky1/asdf.css
/brunobronosky2/asdf.css
/cornegigouille/asdf.css

## asdf.min.css ##
[no match]
/brunobronosky2/asdf.min.css
/cornegigouille/asdf.min.css
1 голос
/ 24 марта 2017

Ответ Бруно отличный, но неполный.
Это не относится к случаю, когда имя файла содержит несколько точек. Это довольно часто, когда вы начинаете использовать минификацию (например, www.mysite.com / css / styles.min.css ).

Следовательно, 2-е условие 2-го блока правил должно быть:

# condition: uri doesn't end with filename.extension
RewriteCond %{REQUEST_URI}  !/[^/.]+(\.[^/.]+)+$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...