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

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Задача. Необходимо переадресовать с поддомена poddomen.misite.ru на misite.ru/poddomen/  
 
Использую следующий код.  
 

Код:
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteCond %{REQUEST_FILENAME} !-l  
RewriteCond %{HTTP_HOST} (www\.)?([a-z0-9\-_]+)\.misite\.ru [NC]  
RewriteRule .? http://misite.ru/%2/ [NC,L,R=301]  
 

 
Проблема в следующем когда я в адресной строке набираю http://poddomen.misite.ru то никаких действий не происходит, но как только я перехожу на страницу глубже, допустим http://poddomen.misite.ru/page1/ то код срабатывает и меня перекидывает на http://misite.ru/poddomen/  
 
Подскажите в чом кроется проблема.  
Заранее благодарю за ответ.

Всего записей: 65 | Зарегистр. 29-09-2008 | Отправлено: 06:14 29-01-2013 | Исправлено: mishakor, 07:21 29-01-2013
mishakor

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
проблема ещё актуальна, решения так и не нашел(

Всего записей: 65 | Зарегистр. 29-09-2008 | Отправлено: 08:06 01-02-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mishakor
включите на время логи обработки mod_rewrite и станет очевидно в чем дело
да и с чего должно срабатывать в корне, если вы указали
 

Цитата:
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteCond %{REQUEST_FILENAME} !-l  

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

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 10:43 01-02-2013
mishakor

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

Всего записей: 65 | Зарегистр. 29-09-2008 | Отправлено: 10:11 05-02-2013
unreal666



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Такой вопрос.
Скачал исходники сайта html5test.com .
У него в корне лежит такой .htaccess.

Код:
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
 
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.html5test\.com$
RewriteRule ^ http://html5test.com%{REQUEST_URI} [L,R=301]
 
RewriteCond %{HTTP_HOST} ^(beta.)?cn.html5test.com
RewriteRule ^translation.js$                /translations/cn/index.js
 
RewriteRule ^translation.js$                /translations/en/index.js
 
RewriteRule ^compare.html$                    /compare/browser/index.html                                [R]
RewriteRule ^results.html$                    /results/desktop.html                                    [R]
RewriteRule ^results-mobile.html$            /results/mobile.html                                    [R]
RewriteRule ^results-tablets.html$            /results/tablet.html                                    [R]
RewriteRule ^results-tv.html$                /results/television.html                                [R]
 
RewriteRule ^api/(.+)$                         /backend/index.php?method=$1&%{QUERY_STRING}
RewriteRule ^compare/browser/index.html$     /backend/browser.php?%{QUERY_STRING}
RewriteRule ^compare/browser/(.+).html$     /backend/browser.php?show=$1&%{QUERY_STRING}
RewriteRule ^compare/feature/index.html$     /backend/feature.php?%{QUERY_STRING}
RewriteRule ^compare/feature/(.+).html$     /backend/feature.php?show=$1&%{QUERY_STRING}
RewriteRule ^results/desktop.html$            /backend/results.php?type=desktop
RewriteRule ^results/mobile.html$            /backend/results.php?type=mobile
RewriteRule ^results/tablet.html$            /backend/results.php?type=tablet
RewriteRule ^results/gaming.html$            /backend/results.php?type=gaming
RewriteRule ^results/television.html$        /backend/results.php?type=television
 

 
Судя по нему, условие

Код:
RewriteCond %{HTTP_HOST} ^(beta.)?cn.html5test.com

распространяется только на 1-ое правило

Код:
RewriteRule ^translation.js$                /translations/cn/index.js

Почему?
Пустая строка прерывает условие RewriteCond что ли?

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



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

Цитата:
Пустая строка прерывает условие RewriteCond что ли?

нет.  
RewriteCond работает на следующий RewriteRule
на самом деле срабатывает сначала RewriteRule, а затем проверяются RewriteCond над ним.
 
вот тут все отлично описано  
http://www.egoroff.spb.ru/portfolio/apache/mod_rewrite.html

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
я чего спросил.
В вышеприведенном .htaccess  правила ниже "RewriteRule ^translation.js$                /translations/cn/index.js" никаким боком не связаны с условием "RewriteCond %{HTTP_HOST} ^(beta.)?cn.html5test.com", т/е/ они действуют и на просто html5test.com безо всяких там префикса cn. впереди.
Почему же тогда они срабатывают?

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



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

Цитата:
Почему же тогда они срабатывают

RewriteCond накладывает дополнительные условия, они необязательны.
 
Сказал же - сначала идет проверка шаблона в RewriteRule, если совпадает, тогда идет проверка RewriteCond (если есть).
 

Цитата:
RewriteRule ^translation.js$                /translations/en/index.js  

срабатывает, если идет обращение к translation.js в данной папке или корне сайта (смотря где находятся условия)

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

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



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

Цитата:
Сказал же - сначала идет проверка шаблона в RewriteRule, если совпадает, тогда идет проверка RewriteCond (если есть).

вот это и не понял.
Правило совпало => смотрим выше на присутствие RewriteCond => условие в RewriteCond не соответствует => по фигу, что не соответствует; все равно сделаем преобразование.
Так что ли?
 

Цитата:
срабатывает, если идет обращение к translation.js в данной папке или корне сайта (смотря где находятся условия)

почему? Выше же есть правило, которое тоже подпадает под это. Или mod_rewrite в рандомном порядке их ищет?

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



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

Цитата:
условие в RewriteCond не соответствует => так с какого перепугу все равно правило сработает?  

 
а почему вы решили, что срабатывает именно переброс на китайскую трансляцию?
а не следующее правило, перекидывающее на английский вариант?
 
китайское не должно (если не с домена beta.cn.html5test.com или cn.html5test.com), а английское может
 
если нужны подробности обработки - включайте, на время, логгирование для mod_rewrite

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
потестил с 9-м уровнем логирования.
Чего-то у меня получилось, что если правило в RewriteRule совпало, но при этом не совпало вышележащее условие RewriteCond, то это условие в дальнейшем игнорируется.

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



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

Цитата:
но при этом не совпало вышележащее условие RewriteCond, то это условие в дальнейшем игнорируется.

ну, а я о чем говорил выше?  
сначала RewriteRule, потом проверяется RewriteCond

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну так ты же не говорил, что, если RewriteCond не совпал, то он просто отбрасывается (в последующем игнорируется) вместе со своим совпавшим RewriteRule.

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



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

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

почему это не говорил?
 

Цитата:
Сказал же - сначала идет проверка шаблона в RewriteRule, если совпадает, тогда идет проверка RewriteCond (если есть).  

какой смысл во второй проверке тогда? чтобы RewriteRule фактически выполнился, если удовлетворяется и RewriteCond
 


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

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



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

Цитата:
какой смысл во второй проверке тогда?

а я про это и не говорил. Просто для меня при не совпадении RewriteCond было бы логичнее вообще отбросить все нижележащие правила до следующего RewriteCond. Тогда и 2-ая проверка не нужна была бы.

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



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

Цитата:
RewriteCond было бы логичнее вообще отбросить все нижележащие правила до следующего RewriteCond

так и делается.
 
но исторически обработка начинается с RewriteRule - почитайте же ссылку

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

 
поэтому, в принципе, получается тот же самый "отброс от rewritecond (всей группы) до первого rewriterule включительно", просто выполняется иначе.

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

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



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

Цитата:
почитайте же ссылку

да читал. Только там невнятно описано. Была бы нормальная блок схема с "соответствует"/"не соответствует", было бы понятнее. А то там только порядок обработки нарисован. А вот разветвлений типа "если" там нет.  
В описании ниже рисунка тоже как то фигово объяснено про этот алгоритм при разных условиях.

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



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
unreal666
там все отлично написано (лучше, чем где либо еще), нужно лишь вникнуть.
+ http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond

Цитата:
The RewriteCond directive defines a rule condition. One or more RewriteCond can precede a RewriteRule directive. The following rule is then only used if both the current state of the URI matches its pattern, and if these conditions are met.


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

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



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

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



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

Цитата:
из этого не следует вышеописанное.

надоел мне этот флейм ни о чем.. следует и работает.
 
если есть сомнения - показывайте на примере.

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:05 26-03-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