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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
Cheery



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

Цитата:
А поконкретней?  

Виртуальные хосты в Apache 1.3.23, что то не получается...

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 01:25 24-01-2008
Apart

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Редактирование конфигов Apache - это не для шаред-хостинга. А у меня пока именно такой.

Всего записей: 409 | Зарегистр. 10-05-2005 | Отправлено: 16:16 25-01-2008
vitovt



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
что-то я не пойму, а в чем ошибка
RewriteRule ^([0-9A-Za-z\_\-\.]+)(\/)$ /user.php?id=$1 [L,QSA]  
 
должно пропускать тока символы, допустимые в обычном урле, а с тире (-) не пропускает

Всего записей: 1087 | Зарегистр. 02-05-2002 | Отправлено: 13:35 12-02-2008
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот есть код который отвечает за обработку саб доменов:

Код:
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/subdomains/
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com
RewriteRule (.*) /subdomains/%1/$1 [L]

такой вариант подходит всем но мне нужно немного более извращенный можно ли сделать так что бы урлы вида /data/somefile брались не из рутового каталога саб домена а из главного рута домена.  
 
На примере будет легче понять. Есть файл /www/data/somefile.gif и html страничка /www/subdomains/test-site/index.html в нем есть также линки на графику /data/somefile.gif и img/test.gif. Первый файл будет искаться в рутовой директории саб домена а именно в /www/subdomains/test-site/ где каталога data конечно нет, но вот каталог img есть. Вот мне нужно что бы если запрос идет с / (а значит root дира домена) то бралась не root директория саб домена а главного домена а остальное (img/test.gif) как обычно.
 
Спасибо за совет

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 21:37 12-02-2008 | Исправлено: Delphi6, 21:45 12-02-2008
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А вот и решение Вчера наверно усталость сказалась:

Код:
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/subdomains/
RewriteCond %{REQUEST_URI} !^/data/
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com
RewriteRule (.*) /subdomains/%1/$1 [L]

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 12:39 13-02-2008
Serzhik83

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите разобраться.
 
В .htaccess всегда было написано:

Код:
RewriteRule ^page/([0-9]+)(/?)$ page.php?id=$1

Переехал на другой сервер. Теперь правило не работает и сервер, при заходе на http://domain.com/page/6142 выдает в лог:

Цитата:
File does not exist: /home/domain/data/www/domain.com/page/page/6142

Как удалить даную проблему, ведь раньше все работало...

Всего записей: 2 | Зарегистр. 14-02-2008 | Отправлено: 13:07 14-02-2008
6epcepk



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Возвращаясь к теме, которая обсуждалась в принципах построения CMS.
Сейчас работает правило для реврайтинга много языкового сайта:

Код:
RewriteRule ^(ru|en|de)/?news(/?)+$ index.php?lang=$1&module=news [L]
RewriteRule ^news(/?)+$ index.php?module=news [L]

Во-первых, наблюдается избыточность: хотелось бы обойтись одной строчкой вместо двух.
Во-вторых, при добавлении нового языка возникает необходимость править файл. В принципе, можно наложить общую проверку на iso-код страны (два символа).
Вышеизложенный код аналогично используется в ABO.CMS, а вот в Битриксе уже что-то реализовано поинтересней: все правила хранятся в базе данных и при запросе любого адреса открывается urlrewrite.php, который (предполагаю) подгружает в себя правила из базы и обрабатывает, а ссылки на сайте (предполагаю) генерируются через определенную функцию.

----------
comming soon..

Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 10:27 15-02-2008 | Исправлено: 6epcepk, 10:34 15-02-2008
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
6epcepk
1) Не думаю что бы можно было все к одной строке свести, либо придется воспользоваться IF оператором в регулярных выражениях но я не уверен что эта конструкция поддерживается в .htaccess (в PHP работает на ура). Еще не уверен что от этого будет прирост, вы все равно будете выполнять первое условие и если оно не даст результата то второе (правда если первое чаще происходит то немного прироста будет).
 
2) Если бы вы описали все возможные варианты запросов (урлов) то можно было бы придумать что-то оригинальное. Я лично никогда не работал с CMS и наизусть ничего не могу посоветовать, разве что как я подозреваю язык всегда две буковки и всегда перед news вот и можно прямо его брать и передавать без проверки (если есть гарант что скрипт н сгючит если ему передать например xx).
 
Добавлено:
Serzhik83

Цитата:
В .htaccess всегда было написано

А вы уверены что у вас разрешено использования mod_rewrite в этой директории? Многие хостера разрешают его размещать только в рутовую директорию.

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 23:07 15-02-2008 | Исправлено: Delphi6, 23:08 15-02-2008
Serzhik83

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

Цитата:
А вы уверены что у вас разрешено использования mod_rewrite в этой директории? Многие хостера разрешают его размещать только в рутовую директорию.

 
Все остальные правила из этого .htaccess работают

Всего записей: 2 | Зарегистр. 14-02-2008 | Отправлено: 04:22 16-02-2008
Cheery



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

Цитата:
Все остальные правила из этого .htaccess работают

htaccess в какой дире лежит?
Цитата:
RewriteRule ^page/([0-9]+)(/?)$ page.php?id=$1

попробовать
RewriteRule ^/page/([0-9]+)(/?)$ page.php?id=$1

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 04:24 16-02-2008
6epcepk



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

Цитата:
Если бы вы описали все возможные варианты запросов (урлов) то можно было бы придумать что-то оригинальное. Я лично никогда не работал с CMS и наизусть ничего не могу посоветовать, разве что как я подозреваю язык всегда две буковки и всегда перед news вот и можно прямо его брать и передавать без проверки (если есть гарант что скрипт н сгючит если ему передать например xx).

К примеру, правила для обработки модуля "Новостная лента":

Код:
RewriteRule ^(ru|en|de)/?news(/?)+$ index.php?lang=$1&module=news [L]
RewriteRule ^news(/?)+$ index.php?module=news [L]
 
RewriteRule ^(ru|en|de)/?news/([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)(/?)+$  
index.php?lang=$1&module=news&category=$2&news=$3 [L]
RewriteRule ^news/([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)(/?)+$ index.php?module=news&category=$1&news=$2 [L]
 
RewriteRule ^(ru|en|de)/?news/([-_a-zA-Z0-9]+)(/?)+$ index.php?lang=$1&module=news&category=$2&%{QUERY_STRING} [L]
RewriteRule ^news/([-_a-zA-Z0-9]+)(/?)+$ index.php?module=news&category=$1&%{QUERY_STRING} [L]

В принципе, избыточность кода хоть и присутствует, но смириться можно.
 
А если попробовать:

Код:
RewriteRule ^(.*)(/?)+$  index.php?query_string=$1 [L]

Тогда мы все запросы получаем в виде одной строки на стороне сервера и уже после обрабатываем ее по собственному механизму.
Для чего это нужно? Если использовать многосайтовость, то невозможно составить правила для .htaccess (если не править файл после добавления каждого сайта), поэтому, возможно, многоязычность + многосайтовость нужно реализовывать вышеописанным способом. (?)

----------
comming soon..

Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 11:13 16-02-2008 | Исправлено: 6epcepk, 11:14 16-02-2008
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
6epcepk
Конечно можно, если вы в состоянии обработать все варианты. Правда придется писать немного по другому:

Цитата:
RewriteRule ^.*$ index.php?query_string=$1 [L]

А потом из скрипта уже передавать хидер с редиректом на нужную страничку (правда тогда будет виден реальный урл что вас не устраивает как я подозреваю). А генерировать http запрос это как бы дополнительно нагружать сервер (я так подозреваю).
 
А что если скрипту передать leng равный пустой строке ''?

Цитата:
RewriteRule ^(ru|en|de|)/?news/([-_a-zA-Z0-9]*|)/([-_a-zA-Z0-9]*|)(/?)+$ index.php?module=news&category=$1&news=$2 [L]

Я бы тоже самое сделал бы и другими параметрами (надо модернизировать запрос так что бы если данный параметр не указан захватывалась пустая строка), если у вас исходник то намного будет легче поправить index.php что бы он смог обрабатывать пустые параметры lang, category, news. Просто банально в начале index.php делаем проверку, если $_REQUET['leng'] == '' то делаем его удаление (как будто его не передавали) unset($_REQUET['leng']). Думаю должно сработать ...
 
p.s. Правда я не уверен в верности регулярного выражения, там немного сложней будет, но можно поэкспериментировать в РНР с разными урлами а только потом уже прописать в .htaccess что бы быть уверенным что все правильно захватывается.

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 11:36 16-02-2008
6epcepk



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

Цитата:
Конечно можно, если вы в состоянии обработать все варианты. А потом из скрипта уже передавать хидер с редиректом на нужную страничку (правда тогда будет виден реальный урл что вас не устраивает как я подозреваю). А генерировать http запрос это как бы дополнительно нагружать сервер (я так подозреваю).

А что мешает написать регулярные выражения до загрузки модулей (у меня это делается в файле index.php), после чего получаем "искусственно" все значения QUERY_STRING (при помощи того же pcre) и записываем их в $_GET, а загрузчик модулей уже работает как раз с $_GET.
 

Цитата:
Я бы тоже самое сделал бы и другими параметрами

Свежее интересное решение, я поэкспериментировал (пока без языкового параметра):

Код:
RewriteRule ^news/([-_a-zA-Z0-9]*)/([-_a-zA-Z0-9]*)(/?)+$ index.php?module=news&category=$1&news=$2 [L]

QUERY_STRING получается пустым на стороне сервера (убрал квантификатор `|` - apache выдавал 500-ю ошибку).

----------
comming soon..

Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 11:53 16-02-2008
Delphi6



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

Цитата:
А что мешает написать регулярные выражения до загрузки модулей (у меня это делается в файле index.php), после чего получаем "искусственно" все значения QUERY_STRING (при помощи того же pcre) и записываем их в $_GET, а загрузчик модулей уже работает как раз с $_GET.

Ой а вот на счет этого я как то не сообразил, как говориться а ларчик просто открывался Действительно намного легче сделать чем все остальное (в РНР у вас руки развязаны).
 

Цитата:
QUERY_STRING получается пустым на стороне сервера (убрал квантификатор `|` - apache выдавал 500-ю ошибку).

Я это предполагал вот почему сказал что сначала надо проверить в РНР и только потом прописывать в .htaccess. Сейчас немного занят, надо в своем скрипте немного доработку сделать а вот уже к вечеру займусь вашим рег. выражением, уверен что мы найдем решение .

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 12:44 16-02-2008
6epcepk



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Решение оказалось на поверхности: необходимо было наложить условие на символ`/`, разделяющий данные в запросе:

Код:
RewriteRule ^(ru|en|de)?/?news/?([-_a-zA-Z0-9]*)/?([-_a-zA-Z0-9]*)(/?)+$ index.php?lang=$1&module=news&category=$2&news=$3 [L]


----------
comming soon..

Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 15:57 16-02-2008
Tonyas



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите правильно написать RewriteRule  
Есть ссылка вида  
 
http://site/folder/1f/1f/1/1/2006/xxxx/7/1/1/2003/xxx/7/l.gif  
 
ее нужно преобразовать в ссылку вида  
http://site/folder/file.php?a=1f&b=1f&c=1&d=1&e=2000&f=%C4%EE&k=3&l=1&m=1&n=2007&o=%E2&p=3  
 
 
Вот так работает но частично 10 11 и 12 переменная на 1 заменяются  
RewriteRule ^([a-z_0-9\.\-]{3,40})/([a-z_0-9\.\-]{3,40})/([0-9]+)/([0-9]+)/([0-9]+)/(.*)/([0-9]+)/([0-9]+)/([0-9]+)/([0-9]+)/(.*)/([0-9]+)/l.gif$ file.php?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&k=$7&l=$8&m=$9&n=$10&o=$11&p=$12  
 
как правильно прописать?

Всего записей: 10 | Зарегистр. 20-02-2008 | Отправлено: 21:20 20-02-2008
Cheery



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

Цитата:
Есть ссылка вида  
 
http://site/folder/1f/1f/1/1/2006/xxxx/7/1/1/2003/xxx/7/l.gif  
 
ее нужно преобразовать в ссылку вида  
http://site/folder/file.php?a=1f&b=1f&c=1&d=1&e=2000&f=%C4%EE&k=3&l=1&m=1&n=2007&o=%E2&p=3  

вам не кажется, что между ними какое то несоответствие?


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:57 20-02-2008
Tonyas



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну немного не совпадает, но суть одна и та же
вот так
http://site/folder/file.php?a=1f&b=1f&c=1&d=1&e=2006&f=%C4%EE&k=7&l=1&m=1&n=2003&o=%E2&p=7  
 
текст иероглифами набирать не умею
 
значения a b c d..... постоянно меняются, мне нужно чтоб картинка перебрасывала на запрос в файлик пхп, для 7 переменных чудно работает, а после 9 проблемы.
пробовала с помощью флага [с] сделать ссылку но чтото не получилось

Всего записей: 10 | Зарегистр. 20-02-2008 | Отправлено: 09:58 21-02-2008
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Tonyas
Ну для начала вам надо почитать базис регулярных выражений, форум вам может помочь но вряд ли сделает это за вас ))) Посмотрите готовые примеры из цикла 4 статей в шапке темы, я уверен что после прочтения его вы уже самостоятельно сможете его составить (он очень простой).

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 12:29 21-02-2008 | Исправлено: Delphi6, 12:33 21-02-2008
Tonyas



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Delphi6, как вы думаете зачем я прошу помочь, если сама могу написать и все так просто.

Всего записей: 10 | Зарегистр. 20-02-2008 | Отправлено: 15:02 22-02-2008
Открыть новую тему     Написать ответ в эту тему

Страницы: 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