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


Система IP-видеонаблюдения "Линия". Скачать бесплатную демо-версию для 16 камер. НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

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
Yagovdik

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
У меня к ним доступа нету
 
Вообще задача несколько упростилась...
 
теперь я хочу для рула применять ТОЛЬКО запросы от посетителей, которые пришли НЕ с моего сайта.
Пишу в .htaccess:
 
RewriteEngine On
RewriteBase /
 
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^.*%{HTTP_HOST}.*$ [NC]
RewriteRule ^(.*)$ logger.php?xpage=$1 [L]
 
Для пустого реферера все работает правильно - рул не выполняется...
А вот для реферера с моего же сайта все равно редиректается на logger.php
В чем ошибка то?

Всего записей: 8 | Зарегистр. 10-04-2006 | Отправлено: 19:09 11-04-2006
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RewriteCond %{HTTP_REFERER} !%{HTTP_HOST} [NC]
а так? [NC] тоже вроде как необязательно, но можно оставить  


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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 19:17 11-04-2006
Yagovdik

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
неа - не работает
в [HTTP_REFERER] локальный урл
а все равно редиректается на логгер

Всего записей: 8 | Зарегистр. 10-04-2006 | Отправлено: 19:35 11-04-2006
Cheery



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

Цитата:
а все равно редиректается на логгер

тогда ощущение, что не совпадает http_host с тем, с чем надо..
RewriteRule ^(.*)$ logger.php?xpage=$1&host=%{HTTP_HOST}
или в самом php скрипте посмотри, чем равно значение переменной?

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 19:38 11-04-2006
Yagovdik

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
$_SERVER['HTTP_HOST'] => yag.ph****s.net
 
[argv] => Array
        (
            [0] => xpage=logger.php&host=yag.ph****s.net
        )
 
xpage=logger.php - это из-за того что редирект еще раз прогоняется
это мой сервер - все правильно

Всего записей: 8 | Зарегистр. 10-04-2006 | Отправлено: 19:45 11-04-2006
Cheery



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

Цитата:
xpage=logger.php - это из-за того что редирект еще раз прогоняется  
это мой сервер - все правильно

дык сделай, чтобы не прогонялся.. или добавь 3 условие
причина то как раз в этом и может быть..
RewriteCond %{QUERY_STRING} !^\/loggep\.php
но если честно, то я не вижу причин (наверно просто не выспался).
в таких ситуациях неплохо бы включить логирование обработки mod_rewrite на тестовом сервере  и посмотреть обработку.
 


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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 19:51 11-04-2006 | Исправлено: Cheery, 19:55 11-04-2006
Yagovdik

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ну вот какой файл получился
RewriteEngine On
RewriteBase /
 
RewriteCond %{REQUEST_URI} !logger\.php
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !%{HTTP_HOST} [NC]
RewriteRule ^(.*)$ logger.php?xpage=$1&host=%{HTTP_HOST}
 
и не работает
Все равно не понимает своего реферера
 
Добавлено:
RewriteCond %{HTTP_REFERER} !%{HTTP_HOST} [NC]
а вот это правило означает что в HTTP_REFERER не влкючается HTTP_HOST да?
потому что HTTP_HOST у меня без http://, а реферер С http://
 
Я прошу прощения, но мне нужно идти - отвечать сегодня не смогу
Надеюсь завтра вернемся к разговору.

Всего записей: 8 | Зарегистр. 10-04-2006 | Отправлено: 19:56 11-04-2006
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Yagovdik
ок, я нашел причину.. достаточно двух первых условий, как ты писал раньше..
причина в том, что HTTP_HOST содержит точки и когда это подставляется в RewriteCond, то сервер воспринимает их как часть регулярного выражения. И, хотя, при этом оно должно все равно совпадать, но не хочет
поэтому вместо %{HTTP_HOST} нужно честно писать выражение вида !sudomain\.domain\.ru

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:13 11-04-2006 | Исправлено: Cheery, 20:28 11-04-2006
Yagovdik

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

спасибо...
Но хоста я не знаю, к сожалению. Этот скрипт должен быть сервисом, свободно устанавливаемым на любые сайты существующие и проектируемые
Но это так сказать мои догадки... чё там придумал заказчик я не знаю...
 
А в mod_rewrite функций никаких нету?
Мне казалось что пока я искал вопрос на этот ответ - где то мелкало strtolower . По-моему через хэндлер или что то в этом роде...
Кто-нибудь имеет примерчик подобный?
 
Добавлено:
Да - проверил - действительно - работает  
Но не совсем правильно...
Почему то [QUERY_STRING] => xpage=logger.php&host=yag.ph****s.net
то есть похоже на то, что редирект срабатывает несколько раз.
Кроме того в $_SERVER есть вот что:
    [REDIRECT_QUERY_STRING] => xpage=logger.php&host=yag.ph****s.net
    [REDIRECT_REDIRECT_STATUS] => 200
    [REDIRECT_STATUS] => 200
    [REDIRECT_URL] => /logger.php
 
в .htaccess в итоге лежит вот что:
  RewriteEngine On
  RewriteBase /
 
  RewriteCond %{HTTP_REFERER} !^$
  RewriteCond %{HTTP_REFERER} !yag\.ph****s\.net [NC]
  RewriteRule ^(.*)$ logger.php?xpage=$1&host=%{HTTP_HOST} [L]
 
Добавлено:

Цитата:
то есть похоже на то, что редирект срабатывает несколько раз.  

а реферер при этом остается с удаленного сервера

Всего записей: 8 | Зарегистр. 10-04-2006 | Отправлено: 09:35 12-04-2006
Yagovdik

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


Два последних дополнения решились. ЧТо то я стормозил.
Итого окончательный .htacces

Код:
 
RewriteEngine On
RewriteBase /
 
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !yag\.ph****s\.net.* [NC]
RewriteCond %{REQUEST_FILENAME} !logger\.php.* [NC]
RewriteRule ^(.*)$ logger.php?xpage=$1 [L]
 

Когда найду как точки в хосте преобразорвать допишу.
 
файл logger.php:

Код:
 
<?
    // делаем что нам нужно - в моем случае сохранение реферера в базу
?>    
    <script language = "JavaScript">
        location.href='<? echo $_GET['xpage'];?>';
    </script>
 

 
Да, именно
Код:
location.href='<? echo $_GET['xpage'];?>';

Потому что как оказалось
Код:
header("Location: " . $_GET['xpage']);
не изменяет реферера
на logger.php. От того то и были все проблемы.
 
Огромное спасибо всем, кто учавствовал.

Всего записей: 8 | Зарегистр. 10-04-2006 | Отправлено: 09:14 13-04-2006 | Исправлено: Yagovdik, 09:29 13-04-2006
kitty05



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
есть задача:  
 
когда вызывается УРЛ __http://www.somehost.com/fa/private/xxx/zzz/file.rar -  
нужно перенаправлять незаметно для пользователя запрос на __http://www.somehost.com/fa/download/xxx/zzz/file.rar.  
 
т.е. нужно заменить всего часть УРЛ - /private/ на /download/    
 
как сделать?  
 
PS> правило должно действовать только для файлов, не для каталогов.

Всего записей: 29 | Зарегистр. 26-07-2005 | Отправлено: 17:10 14-04-2006
Erick Flatcher



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Подскажите пожалуйста:
 
есть URL: site.ru/index.php/razdel/
хочу URL: site.ru/razdel/
 
Предлагают:
 
1. Как я понимаю это автоматом проверяет, где надо и не надо переименовывать и уже на ходу решает. Так ли это?
 
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f    (это проверяет есть ли такой файл и если есть не переименовывает URL? Так?)
RewriteCond %{REQUEST_FILENAME} !-d    (это проверяет есть ли такая директория и если есть не переименовывает URL? Так?)
RewriteRule ^(.*)$ /index.php/$1 [L]
 
2. Явное указание директорий где НЕнужно переименование:
 
RewriteEngine on
RewriteCond $1 !^(images|system|themes|favicon\.ico|robots\.txt|index\.php)
RewriteRule ^(.*)$ /index.php/$1 [L]
 
Какой из этих методов вы посоветуете использовать? Первый мне мниться более предпочтительным, но боюсь как бы он не сильно сервер загрузил ;-( Запросов должно быть много (посещаемость сайта 12.000+ хостов в сутки).
 
Большое всем спасибо.

Всего записей: 563 | Зарегистр. 12-10-2001 | Отправлено: 13:00 17-04-2006
phpcoder

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Такую задачу не могу решить:
делаю мод-рерайтом директорию, например http://domain.com/dir/

Код:
 
RewriteEngine On
Options +FollowSymLinks
RewriteCond %{REQUEST_URI} !(index.php) [NC]
RewriteRule ^(.*)/$ /index.php?cat=$1 [L]
 

Отлично работает.
Теперь я хочу чтобы также работал такой урл http://domain.com/dir
Вернее был редирект на http://domain.com/dir/.
Если физически есть лиректория /dir/ то такой .htaccess будет работать:

Код:
 
RewriteEngine On
Options +FollowSymLinks
RewriteCond %{REQUEST_URI} !^(index\.php)$ [NC]
RewriteRule ^/([^/]+)$  /$1/   [R]
 

 
Я попытался объеденить эти две задачи в одну, ничего не получается. Например:

Код:
 
RewriteEngine On
Options +FollowSymLinks
RewriteCond %{REQUEST_URI} !^(index\.php)$ [NC]
RewriteRule ^/([^/]+)$  /$1/   [R]
RewriteRule ^(.*)/$ /index.php?cat=$1 [L]
 

т.е. сначала редиректнуть на урл с "/" а потом получить преобразование domain.com/dir/ в domain.com/index.php?cat=dir

Всего записей: 194 | Зарегистр. 23-05-2004 | Отправлено: 19:28 22-05-2006
iglezz

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

Код:
RewriteCond %{REQUEST_URI} !(index\.php) [NC]  
RewriteRule ^(.*[^/])$ /index.php?cat=$1 [S]
RewriteRule ^(.*)/$ /index.php?cat=$1 [L]

Всего записей: 617 | Зарегистр. 18-02-2003 | Отправлено: 21:44 11-06-2006 | Исправлено: iglezz, 22:07 11-06-2006
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
phpcoder
Для борьбы с недостающими слэшами использую следующий метод:
В самом конце файла .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]
 


Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 10:22 13-06-2006
SiMM

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dacuan, и что у вас получится, если дадут необрабатываемую предыдущими правилами ссылку? Бесконечный редирект...

Всего записей: 2300 | Зарегистр. 14-05-2004 | Отправлено: 11:24 13-06-2006
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SiMM
Бесконечного редиректа не будет из-за строки

Код:
 
RewriteCond %{REQUEST_URI}      !/$
 

Редирект происходит только, если УРЛ не заканчивается на слэш

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 11:39 13-06-2006
SiMM

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

Всего записей: 2300 | Зарегистр. 14-05-2004 | Отправлено: 15:52 13-06-2006
razawa



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Почитал тему.
Вот что у меня вышло. Простая замена всех *.htm запросов на index.php?path=*.htm

Код:
RewriteEngine on
Options +FollowSymlinks
RewriteCond %{REQUEST_URI} !^.*index.php.*
RewriteRule ^(.*)(\.ht.*)$ http://www.www.com/index.php?path=$1$2

Все работает.
Дальше - не пойму.
Пользователь когда вводит а) "http://www.www.com/arc/1/index.htm" попадает на
б) "http://www.www.com/index.php?path=arc/1/index.htm"
Зачем мне это нужно - не спрашивайте - нужно
Но как сделать чтобы пользователь не видел это index.php, а видел то, что он вводил в строке браузера? Читал-читал - не понял.
Подскажите?
 

Всего записей: 59 | Зарегистр. 18-08-2004 | Отправлено: 10:16 03-07-2006 | Исправлено: razawa, 10:17 03-07-2006
sTa1kEr



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

Цитата:
Но как сделать чтобы пользователь не видел это index.php

Пользователь итак его не видит
 

Код:
RewriteEngine on  
RewriteCond %{REQUEST_URI} \.html?$
RewriteRule ^(.*)$ index.php?path=$1 [L]

Имхо, так будет правильнее, короче и удобнее. А Options +FollowSymlinks здесь не к месту.

Всего записей: 279 | Зарегистр. 28-07-2005 | Отправлено: 10:45 03-07-2006 | Исправлено: sTa1kEr, 11:00 03-07-2006
Открыть новую тему     Написать ответ в эту тему

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

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

Имя:
Пароль:
Сообщение

Для вставки имени, кликните на нем.

Опции сообщенияДобавить свою подпись
Подписаться на получение ответов по e-mail
Добавить тему в личные закладки
Разрешить смайлики?
Запретить коды


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

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2017

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru