Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » mod_rewrite: документация, готовые решения, вопросы

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

Открыть новую тему     Написать ответ в эту тему

Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mod_rewrite

Вот уже несколько раз встретился с этим вопросом. Недавно в тех. задании было указано что проект должен быть оптимизирован под поисковые системы. Поискав немного попал на mod_rewrite. Оказывается что mod_rewrite очень и очень полезная вещь. Вот несколько причин почему я решил разобраться с данным зверем:
 

  1. Если вы пишите форумы, сайт с новостями или любой сайт в котором есть конструкция hттp://mybestsite.com/article.php?n=3&page=1. Вы рано или поздно встретитесь с проблемой лицом к лицу, у таких сайтов есть огромный минус: адрес сайта выглядит для пользователей не "нормально", такой адрес не индексируется многими поисковыми системами, удаляется все после знака "?". Ниже приведенные ссылки для него все одни, но просмотрев их он получает разное содержимое (Что плохо сказывается на статистику вашего сайта)

    Код:
    hттp://mybestsite.com/article.php?n=3&page=1
    hттp://mybestsite.com/article.php?n=5&page=2
    hттp://mybestsite.com/article.php?n=6&page=7

    Пользователи у которых нету базовых знаний в Web программировании не могут понять что значит текст после article.php (?n=3&page=1). С использованием mod_rewrite можно на лету преобразовывать адреса типа

    Код:
    hттp://mybestsite.com/article.php?n=3&page=1

    в такой, более понятный и привычный для обыкновенных пользователей

    Код:
    hттp://mybestsite.com/articles/3/page1.htm

    А самое интересное что файл page1.htm вообще не существует, и пользователю не известен путь к файлу к которому он обращается и поисковые системы воспринимают такой адрес как обыкновенную ссылку на html страничку.
     
  2. С помощью mod_rewrite можно запретить скачивать ваши материалы с других сайтов, на собирание которых вы провели бессонные ночи. Например: у вас есть файл bestprogram.zip, у вас на страничке есть линк

    Код:
    <a href="hттp://mybestsite.com/download/bestprogram.zip">Download</a>

    какой-то придурок залазит на ваш сайт, просмотривает html код вашей странички и размещает туже ссылку но уже у себя на сайте.

    Код:
    <a href="hттp://mybestsite.com/download/bestprogram.zip">Download</a>

    и она будет работать без проблем, за трафик будет платить вы а слава и благодарности этому придурку! С помощью mod_rewrite можно запретить cкачивание файлов если referer не ваш сайт

 
Думаю этого достаточно что бы потратить несколько часов на изучение данного материала. Ниже привожу документацию по данному вопросу:
Русские ресурсы

Английские ресурсы

 
Необходимые навыки:

 
Настройка журналирования (Лога):
 
Чтобы включить лог mod_rewrite необходимо в описании вашего виртуального хоста (обычно это файл httpd.conf) добавить две строчки:  

Код:
Код:RewriteLog /путь/к/лог/файлу  
RewriteLogLevel 9  

И перезапустить апача. Крайне не рекомендуется производить это на работающем сервере, так как объемы отладочной информации генерируются действительно большие и найти свое бывает очень сложно.
 
ps: Доп ссылки
Много полезных примеров, но на английском http://www.askapache.com/htaccess/mod_rewrite-tips-and-tricks.html




PHP тут не совсем к месту в названии, потому убрал /Cheery/

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 15:26 24-06-2005 | Исправлено: Cheery, 01:07 11-10-2011
phpbbmods

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
edogs
это /? просто делает возможным работы /main
но не закрывает слэшь!

Всего записей: 322 | Зарегистр. 09-02-2004 | Отправлено: 09:47 01-12-2006
sTa1kEr



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
может, кто подскажет, как закрыть слеш на конце  

В этом топике уже было решение:
 

Цитата:
Для борьбы с недостающими слэшами использую следующий метод:  
В самом конце файла .htaccess пишу следующее правило.  
Важно Правило должно быть последним  
 

Код:
###########################  
#     SLASH PROBLEM  
###########################  
 
RewriteCond %{REQUEST_URI}      !/$  
RewriteCOND %{REQUEST_URI}      ![^/]*\.[^/]*$  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteRule ^(.*)$          http://%{HTTP_HOST}/$1/ [NS,L,R=301]  
 

 

Всего записей: 279 | Зарегистр. 28-07-2005 | Отправлено: 11:33 01-12-2006
phpbbmods

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sTa1kEr
да прав но такой код чтото у меня работает но он убивает условия другие,
я вот немогу понять  
RewriteCOND %{REQUEST_URI}      ![^/]*\.[^/]*$
если не выполняется то идет
RewriteRule ^(.*)$          http://%{HTTP_HOST}/$1/ [NS,L,R=301]  
те незакрыта слэшь идет перенаправление?

Всего записей: 322 | Зарегистр. 09-02-2004 | Отправлено: 22:12 01-12-2006
sTa1kEr



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
phpbbmods

Цитата:
те незакрыта слэшь идет перенаправление?  

Т.е. если нету слеша в конце, то перенаправляется на тот же адрес, но со слешем на конце

Всего записей: 279 | Зарегистр. 28-07-2005 | Отправлено: 00:14 02-12-2006
kentik



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
пипл, если кто работал с RewriteMap, подскажите
не видит скрипт в упор: map lookup FAILED
использую prg:
если использовать просто txt: , то все работает

Всего записей: 54 | Зарегистр. 29-11-2002 | Отправлено: 16:26 02-12-2006
sTa1kEr



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kentik
Права на исполнение файла есть?
Путь к интерпретатору на 1ой строке прописан?

Всего записей: 279 | Зарегистр. 28-07-2005 | Отправлено: 14:19 03-12-2006
kentik



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sTa1kEr
ага, права и 777 ставил и из командной строки запускал, сам по себе пашет
 
пробовал и под виндой тоже, даже скрипт в exe скомпилил
 
под юниксом апач 1.3, под виндой 2

Всего записей: 54 | Зарегистр. 29-11-2002 | Отправлено: 15:31 03-12-2006
sTa1kEr



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kentik

Цитата:
Путь к интерпретатору на 1ой строке прописан?  

???

Всего записей: 279 | Зарегистр. 28-07-2005 | Отправлено: 17:55 03-12-2006
batton

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а возможно ли сделать чтобы по одному совпадению с  правилом выполнялось два действия.
а именно: переписывался УРЛ и вызывался скрипт?
 

Всего записей: 83 | Зарегистр. 18-08-2004 | Отправлено: 19:30 03-12-2006 | Исправлено: batton, 19:50 03-12-2006
kentik



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sTa1kEr
само собой прописан
 
вообще кто-нибудь пробовал в качестве карты скрипт подключать?

Всего записей: 54 | Зарегистр. 29-11-2002 | Отправлено: 21:31 03-12-2006 | Исправлено: kentik, 14:31 04-12-2006
kentik



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
таки запустил под виндой
 
httpd.conf
<IfModule mod_rewrite.c>
 RewriteEngine        on
 RewriteMap        fs "prg:C:/php/php-win.exe -f C:/www/localhost/test.php"
</IfModule>
 
 
test.php
<?
do
{
   $in = trim(fgets(STDIN,8096));
   if (strlen($in) >0)
   {
      fputs(STDOUT, "false\n");
   }
} while (true)
?>
 
.htaccess
Options        FollowSymLinks
RewriteEngine    on
RewriteCond    ${fs:false} false

Всего записей: 54 | Зарегистр. 29-11-2002 | Отправлено: 12:37 05-12-2006
2ramil

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
нужно, чтобы все запросы к /folder перенаправлялись на /index.php?m=folder, а /folder/param на /index.php?m=folder&a=param, и чтобы ещё настоящая папка /forum тоде была доступна. можете помочь?

Всего записей: 55 | Зарегистр. 23-10-2006 | Отправлено: 16:06 28-12-2006
Teze

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Это правда, что сложная структура ЧПУ прибавит нагрузки на сервер? Типа site.com/1/2/3/4/5/6/7/8/9/0/ и так далее.
 

Всего записей: 17 | Зарегистр. 06-06-2006 | Отправлено: 08:55 07-01-2007
afiget



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2ramil
Тип параметра не указан, допустим, число
 
RewriteRule ^folder[/]?$  index.php?m=folder [L]
RewriteRule ^folder/([0-9]+)[/]?$  index.php?m=folder&a=$1 [L]
 
PS
Не проверял. Сделал по аналогии со своим.

Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 18:29 07-01-2007
SlayeR



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ой не знаю туда ли обращаюсь, но вот задача:
 
На сервере существует файл, название которого зашифровано в непонятный набор символов.
Что то вроде: kaskldwokmxcnuenxsirrfd.jpg Ситуация обязывает не показывать нормальных имён.
Нужно при обращении к этому файлу название расшифровывать. Допустим  kaskldwokmxcnuenxsirrfd.jpg расшифровывается в picture.jpg и пользователь сохраняет картинку уже под нормальным именем.
Сам алгоритм шифрования/дешифрования написан на php.
 
В итоге если пользователь будет открывать:
http://mydomain.com/dir/picture.jpg (которого нет), то ему выдаст физически существующий http://mydomain.com/dir/kaskldwokmxcnuenxsirrfd.jpg  
 
1. Вот как подменить имя файла?  
2. mod_rewite поможет?  
3. Тогда каким образом нужно передавать имя файла php скрипту.
4. И как потом возвращать уже обработанное имя апачу?  
5. Никто не видел готовых решений?

Всего записей: 33 | Зарегистр. 02-08-2004 | Отправлено: 05:06 14-01-2007
batton

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
на перле я делал так:
база с парой - имя реальное | имя выдаваемое
скрипт читает запрашиваемое имя выбирает из базы реальное расположение ( у меня еще делает симлинк) и отдает через print "Location:url /n/n"
НО это я делал для контроллируемой отдачи pdf
а mod_rewrite как раз и поможет преобразовать http://mydomain.com/dir/picture.jpg в http://mydomain.com/script.php?file=picture.jpg
хотя опять же, если картинки просто в теле страницы то это надо решать по другому

Всего записей: 83 | Зарегистр. 18-08-2004 | Отправлено: 12:16 15-01-2007
SlayeR



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ух разобрался. RewriteMap рулит, но есть пару вопросов.
 
Так у меня работает под виндой:
httpdconf (в VirtualHost, если есть оный)

Код:
 
RewriteMap map "prg:D:/Server/PHP/php-win.exe -f D:/WWW/map.php"
 

 
.htaccess

Код:
 
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) ${map:$1} [L,QSA]
 

 
map.php

Код:
 
function checkPath($url) {
    //ваш код
}  
 
while($in = trim(fgets(STDIN,8096)))
{
   if (strlen($in) >0)
   {
      //раскоментируйте строчки, чтобы вести лог изменения урл
      //$fp = fopen('map.txt','a');
      //fputs($fp, date('d-m-Y H:i:s ').$in."\n");
       
     //внимание! если $name будет равно $in то будет вечный цикл.
     // в функции checkPath можно делать всё что угодно, но не возвращать тоже самое
      $name = checkPath($in)
      //fputs($fp, date('d-m-Y H:i:s ').$name."\n");
       
      fputs(STDOUT, "$name\n");
   }
}
 

 
А вопросы такие:
Как должна выглядеть строчка

Код:
 
RewriteMap map "prg:D:/Server/PHP/php-win.exe -f D:/WWW/map.php"
 
, если данное решение использовать уже под linux?
 
В документации mod_rewrite упоминается RewriteLock, который можно использовать в работе с RewriteMap, так вот вопрос - для чего? Только плиз доступным языком а не как в документации - "для синхронизации".

Всего записей: 33 | Зарегистр. 02-08-2004 | Отправлено: 05:57 21-01-2007 | Исправлено: SlayeR, 06:00 21-01-2007
Qwezar



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Люди, нужен хэлп. В общем в .htaccess:  
 
для изменения линков на index.php сделал так  
 

Код:
.....  
RewriteRule ^(.*)$ /index.php?id=$1  
.....

 
но кроме index.php, есть admin.php. Как сделать чтоб отдельно и на index.php и на admin.php обращаться?  
 
т.е. если id=qwe выполнять на index.php, если id=ewq выполнять на admin.php
 
что у меня в .htaccess:  
 
Код:RewriteEngine on  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteRule ^(.*).html$ /index.php?id=$1

Всего записей: 360 | Зарегистр. 31-12-2006 | Отправлено: 20:41 22-01-2007
2ramil

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
нужно, чтобы все запросы к /folder перенаправлялись на /index.php?m=folder, а /folder/param на /index.php?m=folder&a=param, и чтобы ещё настоящая папка /forum тоде была доступна. можете помочь?

Всего записей: 55 | Зарегистр. 23-10-2006 | Отправлено: 21:42 31-01-2007
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2ramil
Имеется в виду, что вместо folder может быть все, что угодно?

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 10:24 01-02-2007
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

Компьютерный форум Ru.Board » Интернет » Web-программирование » mod_rewrite: документация, готовые решения, вопросы


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru