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

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



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

Цитата:
One or more RewriteCond can precede a RewriteRule directive

тот же .htaccess. Перед RewriteRule есть RewriteCond => подходит.
------------
URL http://html5test.com/translation.js. .htaccess в корне сайта.

Код:
The following rule is then only used if both the current state of the URI matches its pattern, and if these conditions are met.

соответствует.

Код:
The following rule is then only used if both the current state of the URI matches its pattern, and if these conditions are met.

условие не выполнено.
=> плевать что не выполнено, все равно преобразуем.
 
Я как раз говорил, о том, что нигде не сказано, что после проверки условия в RewriteCond и  его не совпадении в последующем это условие нижележащими правилами игнорируется, хотя логичнее было бы игнорировать сами эти правила до следующего RewriteCond.

Всего записей: 6637 | Зарегистр. 14-02-2005 | Отправлено: 22:24 26-03-2013 | Исправлено: unreal666, 22:25 26-03-2013
Cheery



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

Цитата:
все равно преобразуем.

логи покажите.. я не верю, что преобразуется.
 

Цитата:
хотя логичнее было бы игнорировать сами эти правила до следующего RewriteCond.

игнорируется только один rewriterule, который идет за (в файле) группой rewritecond  
 
rewriterule может быть один, сам по себе, без rewritecond.
 
поэтому  
 
rewritecond условие1
rewriterule /путь /путь2
 
rewriterule /путь /путь3
 
если попадаем под /путь, но не выполняется условие1, то игнорируется
Цитата:
rewriterule /путь /путь2
, но
Цитата:
rewriterule /путь /путь3

выполняется всегда, если не изменился /путь на что то иное правилами до данного

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:26 26-03-2013 | Исправлено: Cheery, 22:28 26-03-2013
unreal666



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

Код:
RewriteCond %{HTTP_HOST} ^(beta.)?cn.html5test.com
RewriteRule ^translation.js$                /translations/cn/index.js
 
RewriteRule ^translation.js$                 /translations/en/index.js
 
RewriteCond %{HTTP_HOST} ^
здесь другие правила

то было бы понятнее

Всего записей: 6637 | Зарегистр. 14-02-2005 | Отправлено: 22:28 26-03-2013 | Исправлено: unreal666, 22:34 26-03-2013
Cheery



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

Цитата:
то было бы понятнее

ну так укажите разработчикам апача как бы вам хотелось видеть правила.
зачем флейм то в данной теме разводить?
 
меня (да и не только меня) они устраивают пока как есть..
да, бывают сложности, но решаются.

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:30 26-03-2013 | Исправлено: Cheery, 22:30 26-03-2013
unreal666



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

Цитата:
логи покажите.. я не верю, что преобразуется.

так уже же разобрались, что на китайском сайте преобразуется на китайский translation.js, а на любом другом - на англиский.
 
Вот лог

Код:
(3) strip per-dir prefix: E:/www/html5test.com/htdocs/translation.js -> translation.js
(3) applying pattern '^' to uri 'translation.js'
(4) RewriteCond: input='html5test.loc' pattern='^www\.html5test\.loc$' => not-matched
 
(3) strip per-dir prefix: E:/www/html5test.com/htdocs/translation.js -> translation.js
(3) applying pattern '^translation.js$' to uri 'translation.js'
(4) RewriteCond: input='html5test.loc' pattern='^(beta.)?cn.html5test.loc' => not-matched
 
(3) strip per-dir prefix: E:/www/html5test.com/htdocs/translation.js -> translation.js
(3) applying pattern '^translation.js$' to uri 'translation.js'
(2) rewrite 'translation.js' -> '/translations/en/index.js'

Всего записей: 6637 | Зарегистр. 14-02-2005 | Отправлено: 22:31 26-03-2013 | Исправлено: unreal666, 22:32 26-03-2013
Cheery



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

Цитата:
так уже же разобрались, что на китайском сайте преобразуется на китайский translation.js, а на любом другом - на англиский.  

так в чем проблем то тогда?  
в том, что считаете, что это неудобно?
 
тогда, как и сказал,

Цитата:
ну так укажите разработчикам апача как бы вам хотелось видеть правила.  
зачем флейм то в данной теме разводить?  



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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:32 26-03-2013
unreal666



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

Цитата:
ну так укажите разработчикам апача как бы вам хотелось видеть правила.
зачем флейм то в данной теме разводить?

проблема не в том, как он это делает, а в том, что этот нюанс не описан.

Всего записей: 6637 | Зарегистр. 14-02-2005 | Отправлено: 22:33 26-03-2013
Cheery



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

Цитата:
проблема не в том, как он это делает, а в том, что этот нюанс не описан.

какой ньюанс? там все написано, это вы неправильно истолковываете.  
в сотый раз повторяю - я же правильно понял, а изучал именно по этой ссылке и по мануалу.

Цитата:
The following rule is then only used if both the current state of the URI matches its pattern, and if these conditions are met.

RewriteRule, следующий за этими RewriteCond, используется тогда и только в том случе, если URI на данный момент попадает под шаблон в RewriteRule (о котором шла речь выше) и эти условия (во всех RewriteCond до упомянутого ранее RewriteRule) выполняются.
Что не так?

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:36 26-03-2013 | Исправлено: Cheery, 22:38 26-03-2013
unreal666



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

Цитата:
Что не так?

то что вышеуказанный URI подпадает под "RewriteRule, следующий за этим RewriteCond" и под паттерн попадает, но эти условия "RewriteCond до упомянутого ранее RewriteRule" (минимум одно) не выполняются. Но при этом преобразование все равно происходит.

Цитата:
там все написано, это вы неправильно истолковываете.

Значит написано не все. Было бы все, то не так невозможно было бы истолковать.

Всего записей: 6637 | Зарегистр. 14-02-2005 | Отправлено: 22:42 26-03-2013 | Исправлено: unreal666, 22:43 26-03-2013
Cheery



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

Цитата:
то что вышеуказанный URI подпадает под "RewriteRule, следующий за этим RewriteCond" и под паттерн попадает, но эти условия (минимум одно) не выполняются. Но при этом преобразование все равно происходит.  

блин.. да где оно происходит?  

Цитата:
(3) strip per-dir prefix: E:/www/html5test.com/htdocs/translation.js -> translation.js  
(3) applying pattern '^translation.js$' to uri 'translation.js'  
(2) rewrite 'translation.js' -> '/translations/en/index.js'

это уже ДРУГОЕ rewriterule, без условий! rewritecond влияют только на ОДИН rewriterule, который следует прямо за ними. это явно сказано в переводе выделенного куска ранее.
 
все, меня достал этот флейм. не хотите вчитываться - ваше дело.

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:43 26-03-2013 | Исправлено: Cheery, 22:44 26-03-2013
unreal666



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

Цитата:
это уже ДРУГОЕ rewriterule, без условий!

без каких условий?
Это правило подпадает под "во всех RewriteCond до упомянутого ранее RewriteRule".
- RewriteCond выше есть?
- Есть.
- Так куда оно делось?
- mod_rewrite его выкинул из своего списка просматриваемых правил.
- где про это написано?
- нигде.

Всего записей: 6637 | Зарегистр. 14-02-2005 | Отправлено: 22:47 26-03-2013
Cheery



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

Цитата:
без каких условий?  

произведем цветовое разделение
RewriteCond %{HTTP_HOST} ^(beta.)?cn.html5test.com  
RewriteRule ^translation.js$                /translations/cn/index.js

 
RewriteRule ^translation.js$                /translations/en/index.js
 
у зеленого RewriteRule есть условие. у красного - нет.
красное не читает зеленые условия, потому что они не относятся к нему.
 

Цитата:
во всех RewriteCond

все, после предыдущего RewriteRule и до следующего после данных условий.
в мануале о подобном и говорится, что условия действуют только на первый (после них) rewriterule, а не на любой другой rewriterule после него.

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:49 26-03-2013 | Исправлено: Cheery, 22:54 26-03-2013
unreal666



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

Цитата:
у зеленого RewriteRule есть условие. у красного - нет.

т.е. RewriteCond работает только для 1-го RewriteRule?

Всего записей: 6637 | Зарегистр. 14-02-2005 | Отправлено: 22:54 26-03-2013
Cheery



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

Цитата:
т.е. RewriteCond работает только для 1-го RewriteRule?

я вам об этом и пишу уже много раз


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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:55 26-03-2013
unreal666



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

Цитата:
я вам об этом и пишу уже много раз

не видел такого.
Если про

Цитата:
RewriteRule, следующий за этими RewriteCond, используется тогда и только в том случе, если URI на данный момент попадает под шаблон в RewriteRule (о котором шла речь выше) и эти условия (во всех RewriteCond до упомянутого ранее RewriteRule) выполняются.

то  "следующий/following" не значит 1-ый. Это любой нижеследующий (до следующего RewriteCond). Вот и нюанс в описании.
 
PS.
Так. Тогда у меня косяк.
У меня есть такой кусок в htaccess (ссылки изменены).

Код:
 
RewriteCond    %{REQUEST_FILENAME}  !-f
RewriteRule    ^xxx\.html?$  index.php?aaa
RewriteRule    ^yyy\.html?$  index.php?bbb
RewriteRule    ^zzz\.html?$   index.php?ccc

Было сделано из расчета, что RewriteCond применяется ко всем нижележащим RewriteRule.
Как тогда переписать такое из расчета, что RewriteCond применяется только к 1-му RewriteRule?  
Кучу "RewriteCond    %{REQUEST_FILENAME}  !-f"  лепить?
 
Добавлено:
Кстати. Вот и косяк, который меня и смутил в русском переводе.
В англ:

Цитата:
If the pattern doesn't match, the complete set of conditions and the corresponding rule fails.

в русском:

Цитата:
Если шаблон не соответствует, весь набор условий и соответствующих правил считается несоответствующим условию.

В английском правило в единственном числе. В русском - во множественном.

Всего записей: 6637 | Зарегистр. 14-02-2005 | Отправлено: 23:05 26-03-2013 | Исправлено: unreal666, 23:13 26-03-2013
Cheery



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

Цитата:
не видел такого.  


Цитата:
rewritecond влияют только на ОДИН rewriterule,  


Цитата:
игнорируется только один rewriterule, который идет за (в файле) группой rewritecond  

и тд и тп.
 

Цитата:
то  "следующий/following" не значит 1-ый.  

значит.. сказано в единственном числе

Цитата:
The following rule is then

 

Цитата:
Было сделано из расчета, что RewriteCond применяется ко всем нижележащим RewriteRule.  
Как тогда переписать такое из расчета, что RewriteCond применяется только к 1-му RewriteRule?  

повторить его перед каждый rewriterule
 

Цитата:
В английском правило в единственном числе. В русском - во множественном.

достаточно посмотреть примеры для понимания. и читать оригинальные мануалы, если возникают вопросы или непонятки с переводом.

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:14 26-03-2013 | Исправлено: Cheery, 23:15 26-03-2013
Laterport



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
При обращении к "сайт/browse.php/" веб сервер выбивает 404 ошибку, без слэша все ок. Знающие, подскажите, пожалуйста, каким способом срезать слэш и редеректить на "/browse.php"

Всего записей: 171 | Зарегистр. 09-02-2012 | Отправлено: 18:55 20-08-2013 | Исправлено: Laterport, 18:56 20-08-2013
Cheery



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

Цитата:
веб сервер выбивает 404 ошибку, без слэша все ок

тут вопрос в том, кто выдает эту ошибку - сервер или скрипт? потому что в php скрипт, таким образом, можно передавать параметры.  
browse.php/gfg
 
REQUEST_URI    /browse.php/gfg
SCRIPT_NAME    /browse.php
PATH_INFO    /gfg
 
и если он получает эти данные, как то обрабатывает и выдает ошибку, то это одно..
тем более если он может и должен работать с подобными параметрами в иной ситуации.
а если выдает сообщение апач, то это другое.

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:18 20-08-2013 | Исправлено: Cheery, 22:20 20-08-2013
Laterport



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
Спасибо за ответ.
С этим разобрался, теперь нужно понять как убрать зацикливание которое проявляется например при таком запросе
 
index.php/wdfvevf/wefv/ewv/wefdv
 
Нагрузка процессора растет и я думаю он скажет пока через некоторое время, если не остановить запрос ) Требуется просто чтобы со ВСЕХ несуществующих страниц, редиректило на индекс. Я думал так и было, но если после индекса ещё слэш и какая-нибудь абракадабра "index.php/sdfvdsfvfd" то происходит зацикливание  
 
сейчас в htaccess такое:
 

Цитата:
 
Options All -Indexes
RewriteEngine On
DirectoryIndex index.php
RewriteRule ^([^-]*)-page-([^-]*)\.php$ /page.php?n=$1&lang=$2 [L]
RewriteRule ^([^-]*)-page.php$ /page.php?n=$1 [L]
RewriteCond %{HTTP_HOST} (.*)
RewriteCond %{REQUEST_URI} /$ [NC]
RewriteRule ^(.*)(/)$ $1 [L,R=301]
ErrorDocument 404 http://сайт/index.php

Всего записей: 171 | Зарегистр. 09-02-2012 | Отправлено: 22:36 20-08-2013 | Исправлено: Laterport, 22:37 20-08-2013
Cheery



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

Цитата:
Нагрузка процессора растет и я думаю он скажет пока через некоторое время, если не остановить запрос  

любой браузер отлавливает зацикленные лупы.
 

Цитата:
С этим разобрался, теперь нужно понять как убрать зацикливание которое проявляется например при таком запросе

ну тут нет явного цикла.. можете считать, к примеру, количество /
 

Цитата:
Требуется просто чтобы со ВСЕХ несуществующих страниц, редиректило на индекс. Я думал так и было, но если после индекса ещё слэш и какая-нибудь абракадабра "index.php/sdfvdsfvfd" то происходит зацикливание  

вопрос тут в том, опять же, что определяет "существует" страница или нет??
она представлена реальным файлом или же запись в базе данных и все обрабатывает один скрипт?


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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:20 20-08-2013
Открыть новую тему     Написать ответ в эту тему

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