URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 7059
[ Назад ]

Исходное сообщение
"Создание человеческих ссылок с mod_rewrite Apache"

Отправлено Meatcoins , 22-Ноя-10 11:19 
Записываю простейшее правило в .htaccess:
RewriteEngine on
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]
Таким образом набираю "localhost/что-нибудь" и в $_REQUEST["page"] получаю адрес запрашиваемой страницы, то есть "что-нибудь".
Но недостаток этого метода в том, что абсолютно все запросы идут через index.php.
Приходится писать в index.php как-то так:
if(preg_match("{jpg}is",$page)||preg_match("{gif}is",$page)||preg_match("{png}is",$page)){
header("Content-type:".getimagesize($page));
echo file_get_contents($page);
exit();
}
if(preg_match("{css}is",$page)){
echo file_get_contents($page);
exit();
}
Это сильно нагружает сервер.
А как бы сделать, что если запрос идёт к .png .css .gif или .jpg, то мы просто выдаём картинку там где она лежит и всё.
Допустим идёт запрос "localhost/какая-то страница" - будет преобразование в "localhost/index.php?page=какая-то страница". Тут всё работает.
А если идет запрос "localhost/some_dir1/some_dir2/pics/some-pic.png" или "localhost/some_dir3/some_dir4/pics/some-pic2.png" то мы его не трогаем - пусть клиенту отдаётся реальная картинка - нам не надо передавать в качестве параметра url этого запроса в index.php.
Как это сделать?
Как правильно записать это в .htaccess?

Содержание

Сообщения в этом обсуждении
"Создание человеческих ссылок с mod_rewrite Apache"
Отправлено Aquarius , 22-Ноя-10 13:13 
>[оверквотинг удален]
> или .jpg, то мы просто выдаём картинку там где она лежит
> и всё.
> Допустим идёт запрос "localhost/какая-то страница" - будет преобразование в "localhost/index.php?page=какая-то
> страница". Тут всё работает.
> А если идет запрос "localhost/some_dir1/some_dir2/pics/some-pic.png" или "localhost/some_dir3/some_dir4/pics/some-pic2.png"
> то мы его не трогаем - пусть клиенту отдаётся реальная картинка
> - нам не надо передавать в качестве параметра url этого запроса
> в index.php.
> Как это сделать?
> Как правильно записать это в .htaccess?

Заменить ^(.*)$ на что-то, чему не будет соответствовать то, для чего не нужен mod_rewrite

P.S. привет от К.О.


"Создание человеческих ссылок с mod_rewrite Apache"
Отправлено Meatcoins , 22-Ноя-10 13:34 
> Заменить ^(.*)$ на что-то, чему не будет соответствовать то, для чего не
> нужен mod_rewrite
> P.S. привет от К.О.

Не, ну это понятно.
Я хотел бы чтоб ссылки href были вида:
"localhost/что-то русскими буквами"
А ссылки типа src не обрабатывались бы mod_rewrite.
Можно сделать так:
RewriteEngine on
RewriteRule ^(.*\.php)$ index.php?page=$1 [L,QSA]
Тогда будет так:
"localhost/что-то русскими буквами.php"
Но так мне не очень нравится.

Можно ли как-то это сделать набором правил: RewriteCond - RewriteRule???


"Создание человеческих ссылок с mod_rewrite Apache"
Отправлено Aquarius , 22-Ноя-10 13:57 
>> Заменить ^(.*)$ на что-то, чему не будет соответствовать то, для чего не
>> нужен mod_rewrite
>> P.S. привет от К.О.
> Не, ну это понятно.
> Я хотел бы чтоб ссылки href были вида:
> "localhost/что-то русскими буквами"
> А ссылки типа src не обрабатывались бы mod_rewrite.

Не, ну это понятно.

> Можно сделать так:
> RewriteEngine on
> RewriteRule ^(.*\.php)$ index.php?page=$1 [L,QSA]
> Тогда будет так:
> "localhost/что-то русскими буквами.php"
> Но так мне не очень нравится.
> Можно ли как-то это сделать набором правил: RewriteCond - RewriteRule???

ага, понятно в чем дело
^(.*)$ можно, например, заменить на что-то типа ^(.*\.[^pcgj][^nsip]e?[^gsf])$
этому выражению не будут соответствовать все URI, заканчивающиеся на .png, .css, .gif, .jpg, .jpeg и, помимо этих, на некоторые другие выражения
строго говоря, это некорректное решение, однако, осмелюсь предположить, что оно подойдет


"Создание человеческих ссылок с mod_rewrite Apache"
Отправлено Meatcoins , 22-Ноя-10 14:38 
Понятно.
Можно и так впринципе...
Нарыл руководство по mod_rewrite http://www.egoroff.spb.ru/portfolio/apache/mod_rewrite.html
Попробую почитать, может мысли какие-то прийдут...

"Создание человеческих ссылок с mod_rewrite Apache"
Отправлено Aquarius , 22-Ноя-10 16:00 
> ага, понятно в чем дело
> ^(.*)$ можно, например, заменить на что-то типа ^(.*\.[^pcgj][^nsip]e?[^gsf])$
> этому выражению не будут соответствовать все URI, заканчивающиеся на .png, .css, .gif,
> .jpg, .jpeg и, помимо этих, на некоторые другие выражения
> строго говоря, это некорректное решение, однако, осмелюсь предположить, что оно подойдет

по какому принципу это (^(.*\.[^pcgj][^nsip]e?[^gsf])$) построено (в обратном порядке):
$ - конец строки
[^gsf] - последние буквы всех суффиксов, нежелательных для обработки mod_rewrite
e? - "исчезающая" буква e в .jpg/.jpeg
[^nsip] - предпоследние буквы всех суффиксов, кроме e из .jpeg, на которую работает 'e?'
[^pcgj] - предпредпоследние буквы всех суффиксов, кроме p из .jpeg, которую сдвинуло 'e?', вместо которой здесь j
\. - '.'
.* -  любое количество любых символов
^ - начало строки


"Создание человеческих ссылок с mod_rewrite Apache"
Отправлено Meatcoins , 22-Ноя-10 16:53 
Не, регулярные выражения я знаю.
Мне просто надо написать правила, которые бы осуществляли задуманное и при этом не сильно грузили сервер. Я написал вот так:

RewriteCond %{REQUEST_FILENAME} \.jpg$|\.gif$|\.png$|\.bmp$
RewriteRule ^.*$ - [L]

RewriteCond %{REQUEST_FILENAME} ^.*$
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]

Тестирую на локальном компе. Не знаю может быть на сервере это будет и ничего, но локальный комп это грузит попосильнее, чем одно условие:
RewriteRule ^(.*\.php)$ index.php?page=$1 [L,QSA]


"Создание человеческих ссылок с mod_rewrite Apache"
Отправлено Meatcoins , 23-Ноя-10 09:07 
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} \.jpg$|\.gif$|\.png$|\.bmp$|\.css$
RewriteRule ^.*$ - [L]
RewriteCond %{REQUEST_FILENAME} .*
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]

Странно, в FireFox тормозит, а Eliphany нормально грузит, может быть у меня ещё и сам FireFox притормаживает... Комп не очень мощный.



"Создание человеческих ссылок с mod_rewrite Apache"
Отправлено Макс , 11-Июл-11 18:00 
Запиши так
RewriteEngine on
RewriteCond %{REQUEST_FILE} !-f
RewriteCond %{REQUEST_FILE} !-d
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]