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

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



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
andead
 
Напиши плизз нормально, а то че то, что с экранированием что без, не пашет вообще

Всего записей: 360 | Зарегистр. 31-12-2006 | Отправлено: 09:30 19-02-2007
andead



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qwezar
RewriteRule ^/(.*?)/(.*?)(/(.*?))?\.htm$ /index.php?a=$1&b=$2&c=$4
 
в апаче не проверял, в Regex Coach ( http://weitz.de/regex-coach/ ) только посмотрел

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 23:08 20-02-2007
Terby

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем доброго времени суток  
 
Столкнулся с проблемой отторжения авторизации при использовании редиректа с применением mod_rewrite  
 
В корне ресурса прописан htaccess со следующим содержанием:  
 
RewriteEngine On  
RewriteCond %{HTTP_HOST} ^domain\.ru$  
RewriteRule ^(.*)$ http://www.domain.ru/$1 [R=301,L]  
 
Этим, мы заставлем apache переадресовывать все адреса без www на www зеркало.  
Все адреса без www прекрасно переадресовываются,  
 
однако, если ссылаться на директорию, которая защищена http-авторизацией, запроса на ввод логина пароля не появляется, вместо этого, сразу идет редирект на 401 ошибку http://domain.ru/401.shtml  
 
В заголовках общения с сервером, обнаружил, что при переадресации через mod_rewrite на запароленную директорию, после  
фразы WWW-Authenticate сразу идет строка: location http://domain.ru/401.shtml, которая и провоцирует редирект.  
 
Искал долго, перепробовал множество сочетаний флажков RewriteRule, но к сожалению решения так и не нашел.

Всего записей: 9 | Зарегистр. 27-02-2007 | Отправлено: 01:43 27-02-2007
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Terby
пробуй, как написал ранее, кидать на файл с <meta> который перекидывает куда надо.
 
а так, ты что то придумываешь.. у меня у самого стоит подобная переадресация и нормально работает с дирами под паролем

Цитата:
IP - - [26/Feb/2007:17:44:55 -0500] "GET /dir/ HTTP/1.1" 302 281 "-" "Mozilla/4.0"
IP - - [26/Feb/2007:17:44:55 -0500] "GET /dir/ HTTP/1.1" 401 1678 "-" "Mozilla/4.0"

 
как сам видишь.. сначала переадресация, а потом запрос пароля..

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 01:46 27-02-2007
Terby

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
c мета не прокатит. Все на одном аккаунте и в RewriteCond в оригинале около трех доменов

Всего записей: 9 | Зарегистр. 27-02-2007 | Отправлено: 02:03 27-02-2007
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Terby
я же говорю.. все работает..
убери только послед. слэш - а то будет повторяться, так как запрос вида server/url перейдет в www.server//url

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 02:08 27-02-2007
Terby

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

Всего записей: 9 | Зарегистр. 27-02-2007 | Отправлено: 02:18 27-02-2007
Cheery



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

Цитата:
там регулярное выражение, экранируется точка - адрес переадресовывается правильно.  

я не об этом

Цитата:
RewriteRule ^(.*)$ http://www.domain.ru/$1  

вот тут последний слэш не нужен..
 

Цитата:
Напиши дословно свой htaccess

у меня в httpd.conf, но смысл не меняется.. написано тоже самое. Apache 2.2.4, но это используется с первых версий apache 2.. да и без разницы тут.. первый или второй апач.


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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 02:33 27-02-2007
Terby

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ты напутал. Убрал слеш, получился при переадресации вот такой веселый урл: http://www.domain.ru401.shtml

Всего записей: 9 | Зарегистр. 27-02-2007 | Отправлено: 03:06 27-02-2007
Cheery



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

Цитата:
Ты напутал.

я напутал ? это у тебя что то не так.. как идет запрос?  
GET  /url
ну так вот /url и отлавливается регуляркой
Цитата:
^(.*)$

у тебя какая версия апача?

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 03:08 27-02-2007
Terby

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

Всего записей: 9 | Зарегистр. 27-02-2007 | Отправлено: 03:17 27-02-2007
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
Terby
Дело в том, что если правила описывать правила mod_rewrite описываются в httpd.conf, то то обрабатываемый путь будет содержить ведущий слэш, а если его описывать в .htaccess, то ведущего слэша не будет, т.е. правило
 

Код:
RewriteRule ^(.*)$ http://www.domain.ru$1

описанное в httpd.conf эквивалентно  

Код:
RewriteRule ^(.*)$ http://www.domain.ru/$1

в .htaccess

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 15:37 27-02-2007
Cheery



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

Цитата:
Дело в том, что если правила описывать правила mod_rewrite описываются в httpd.conf, то то обрабатываемый путь будет содержить ведущий слэш, а если его описывать в .htaccess, то ведущего слэша не будет, т.е. правил

ок.. не экспериментировал.. но все равно.. довольно странно у него ведет - должен всегда запрашивать сначала пароль. сдается мне, что его браузер как то неправильно интерпретирует заголовки.

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 17:01 27-02-2007
Terby

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
дело не в браузере, у меня их три и все ведут себя одинаково
 
При запросе запаролленной дириктории без www вот, что пишется в тексте соединения:
 
WWW-Authenticate: Basic realm="Private zone"
 
После этой строчки апач сразу же пишет сие чудо:
Location: http://www.domain.ru/401.shtml
 
и это ненормально

Всего записей: 9 | Зарегистр. 27-02-2007 | Отправлено: 19:22 27-02-2007 | Исправлено: Terby, 19:23 27-02-2007
kenny_sk8



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Немного порылся в этом mod_rewrite и обнаружил следующее:

Код:
 
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule  ^/?([^?]+)?  index.php?link=$1 [NC,QSA,L]
 

Получается  
из

Код:
 
http://server/asd/34122/add?123=235&sd=gg&link=test
 

в

Код:
 
http://server/index.php?link=asd/34122/add&123=235&sd=gg&link=test
 

 
в обычном варианте, когда нету &link=test всё ок, но вот когда этот параметр появляется возникают проблемы:
$_REQUEST['link'] уже не 'asd/34122/add' а 'test'
 
Можно ли с помощью mod_rewrite сделать так, чтобы link=asd/34122/add шло всегда последним параметром в изменённой строке?
Или есть в этом какой-то другой вариант избавления?

Всего записей: 15 | Зарегистр. 14-09-2004 | Отправлено: 10:47 02-03-2007 | Исправлено: kenny_sk8, 10:54 02-03-2007
Qwezar



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
kenny_sk8
 
смени link в index.php?link=$1 на другую переменную

Всего записей: 360 | Зарегистр. 31-12-2006 | Отправлено: 15:38 02-03-2007
ysnaky

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Задача.
Нужно выполнить только одно из описанных правил:
 
RewriteRule ^/test1/$ /test2/ [L]
RewriteRule ^(.*)$ /test3/ [L]
 
при заходе по ссылке /test1/  ?
 
Как это добится? [L] говорит лишь о том, что за одну итерацию не нужно дальше применять правила. Но как только произойдет отработка первого правила, ссылка прогоняется вновь через все правила, и срабатывает второе.
Нужно при заходе на /test1/ сделать перенаправление на /test2/.
Все остальные запросы на /test3/.
А сейчас получается все перенаправляется на /test3/.
Можно ли как-то без усложнения регэкспов (без уточнения отсутсвия /test1/ во втором правиле), выполнить только одно из правил?

Всего записей: 1 | Зарегистр. 04-03-2007 | Отправлено: 09:57 04-03-2007
Passat19

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребята... уже нет просто сил... дня 3 сижу уже, перерыт весь инет, и все напрасно.
 
Задача тривиальная!
из URL: hттp://xxx.msk.ru/index.php?p=page03
получить URL: hттp://xxx.msk.ru/page03.html
 
Пробовал все варианты:
------------------
RewriteEngine On
RewriteRule ^([^/]*)\.html$ /index.php?p=$1 [L]
------------------
RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteRule ^(.*)/(.*)$ $1index.php?p=$2
------------------
RewriteEngine on  
RewriteBase /  
Options +FollowSymlinks  
RewriteRule ^data/([a-zA-Z0-9]+)\.html$ /index.php?p=$1  
------------------
и многие другие - НЕ РАБОТАЕТ зараза!
 
Вроде не совсем чайник, сервак свой, стоит Server Version: Apache/1.3.37 (Unix) PHP/4.4.4, mod_rewrite включен, включаю отладку мода в httpd.conf - в лог mod_rewrite_log валятся строки типа:
81.222.220.85 - - [05/Mar/2007:01:08:59 +0300] [xxx.msk.ru/sid#8097184][rid#80f5034/initial] (1) [per-dir /home/xxx.msk.ru/public_html/] pass through /home/xxx.msk.ru/public_html/forum/index.php
 
т.е. модуль mod_rewrite работает однозначно, но вот как он работает... не понимаю...
.htaccess работает 100%, проверял.
 
похоже что все-таки что-то с настройкой мода, подскажите плиз где рыть...
причем похоже перестали работать и ранее работавшие строки:
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^hттp://(www.)?xxx.msk.ru(/)?.*$ [NC]
RewriteRule .*\.(pdf|rar|zip)$ hттp://xxx.msk.ru/error.php [R,NC]
 
Спасибо всем большое заранее!

Всего записей: 1 | Зарегистр. 19-07-2005 | Отправлено: 01:51 05-03-2007 | Исправлено: Passat19, 02:00 05-03-2007
Cheery



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

Цитата:
т.е. модуль mod_rewrite работает однозначно, но вот как он работает... не понимаю..

cделай временно 9 уровень логирования и поймешь как он работает и что не так.
временно, иначе при большом количестве обращений съест место

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 06:41 05-03-2007
kenny_sk8



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qwezar
Я бы хотел услышать ответ на попрос как поставить всё это в конец строки, а не то как обозвать переменную.

Всего записей: 15 | Зарегистр. 14-09-2004 | Отправлено: 22:02 07-03-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