2009-06-12 4 views
2

Как я могу добавить слэш к:Продольный слэш

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

Я попытался с:

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

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

+0

Выглядит нормально для меня – Greg

+0

Можете ли вы дать нам больше информации (+ должно быть действительно * хотя..)? Возможно, о том, как вы протестировали это правило. – Gumbo

+0

Содержимое, которое я разместил, это то, что содержит мой .htacess, этот RewriteRule! \. (Js | ico | gif | jpg | png | css | html) $ index.php скопирован из Zend. –

ответ

3

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

См. Подробности/описание для 'last' L 'flag for 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 снайпера кода вместе, но он не работает».


Update: Я поспешно бросил вместе правку к этому ответу на основании ответа cornegigouille в. Вот стенограмма оболочки 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 
+0

ПРИМЕЧАНИЕ. Чтобы сохранить целостность ответа @ cornegigouille, я хочу записать, что у меня первоначально была точка в первом наборе символов последнего RewriteCond, например: «RewriteCond% {REQUEST_URI}!/[^ /.] + \ . [^ /.] + $ 'Это была ошибка, которая сделала мой код хрупким. Я с тех пор исправил это, благодаря им, заботясь достаточно, чтобы указать на это. –

1

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

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

# condition: uri doesn't end with filename.extension 
RewriteCond %{REQUEST_URI} !/[^/.]+(\.[^/.]+)+$ 
+1

7 лет спустя ... приятно! –

+0

Да, 7 лет спустя, это не помогает ОП, но помогает сообществу. –

+1

Большой улов, @cornegigouille. Однако я думаю, что моя ошибка может быть исправлена ​​за счет уменьшения сложности регулярного выражения, а не увеличения его. Кажется, это работает для вас? 'для str in/asdfcss /asdf.css /asdf.min.css; do echo "## $ str ##"; echo $ str | grep -E '/[^/]+\.[^/.] + $ '; done' Я думаю, что это так, но я могу быть психически из контекста после столь долгого времени. –

Смежные вопросы