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

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



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вопрос по ЧПУ.
 
Русские фразы в ЧПУ. Т.е. я вбиваю в ссылку слово  "тел"  
 
т.е. ссылка вида
 
http://localhost/denis/catalogue/search/1/1/norm/offer/~search=тел
 
А когда идет запрос, то получаю "тел"
 
Как поправить?


----------
Заработок 2.0

Всего записей: 788 | Зарегистр. 22-04-2003 | Отправлено: 13:57 10-06-2010 | Исправлено: Tstf, 13:58 10-06-2010
Cheery



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

Цитата:
Как поправить?  

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

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:13 10-06-2010
Tstf



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
так как мне перекодировать? с помощью utf8_decode() ?
 
мне просто необходимо использовать метог GET
 
Разобрался
 
urldecode и urlencode

----------
Заработок 2.0

Всего записей: 788 | Зарегистр. 22-04-2003 | Отправлено: 22:23 10-06-2010 | Исправлено: Tstf, 22:47 10-06-2010
DarkSmoke



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день.
Уважаемые гуру. Подскажите как мне привести в нормальный вид строку типа  
_http://pool/index.php?city=2&firm=1, где:  
city - это ИД города, а хотелось бы что бы нормально выводилось и если есть такая возможность то на русском.  
firm - ИД Фирмы, холтелось бы что бы тоже на русском, если такое возможно.  
 
В итоге хочу получить, _http://pool/Челябинск/ББС ну или _http://pool/chelyabinsk/bbc

Всего записей: 962 | Зарегистр. 08-10-2005 | Отправлено: 20:16 23-06-2010
Mamay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
итить колотить...
DarkSmoke
тебе нужно логику ссылок переделать )
если хочешь чтобы было http://pool/Челябинск/ББС то нужно что-бы ссылки у тебя выглядели как http://pool/index.php?city=Челябинск&firm=ББС
 
иначе нихрена не выйдет


----------
Даже самый дурацкий замысел можно выполнить мастерски

Всего записей: 1352 | Зарегистр. 03-09-2002 | Отправлено: 12:00 24-06-2010
DarkSmoke



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
А как тогда такой запрос будет с БД MySQL работать?

----------
Абонентское обслуживание и ремонт компьютеров в Днепропетровске

Всего записей: 962 | Зарегистр. 08-10-2005 | Отправлено: 13:22 24-06-2010 | Исправлено: DarkSmoke, 14:28 24-06-2010
DarkSmoke



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Помогите составить запрос
у меня ссылки могут быть
http://mydomen/
http://mydomen/index.php?city=piter
http://mydomen/index.php?city=piter&firm=bbs
 
Хочу получить в итоге
http://mydomen/piter
http://mydomen/piter/bbs
 
Сейчас у меня только так работает

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

если добавляю RewriteRule ^(.*)$ index.php?city=$1&firm=&2 [L,QSA], то тогда не работает ссылка вида http://mydomen/index.php?city=piter
 
 
 
Добавлено:
только все слова на русском

Всего записей: 962 | Зарегистр. 08-10-2005 | Отправлено: 16:59 29-06-2010
Cheery



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

Цитата:
сли добавляю RewriteRule ^(.*)$ index.php?city=$1&firm=&2 [L,QSA], то тогда не работает ссылка вида

должна работать - условия выше должны срабатывать только когда нет конечного файла или директории

Цитата:
firm=&2

что такое &2???? если $2, то откуда вы его берете? хоть бы просмотрели документацию, что ли..
$1, $2 и так далее - означает совпадение в скобка в регулярном выражении. у вас же одна пара скобок и не может быть $2 вообще
RewriteEngine on  
 
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
 
RewriteRule ^(.*)/(.*)$ index.php?city=$1&firm=$2 [L,QSA]
но это под второй случай только

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:34 01-07-2010
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Помогите, плиз. Не как не могу понять, чем отличаются
%{REQUEST_URI}
от
%{THE_REQUEST}

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 23:05 04-07-2010
Cheery



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

Цитата:
%{REQUEST_URI}  

/пусть/файл

Цитата:
%{THE_REQUEST}  

GET /путь/файл HTTP/1.0

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 00:18 05-07-2010
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Cheery, помогите пожалуйста.
Есть URL http://host/dir1/dir2/ .
Я хочу, что бы при заходе на этот URL пользователь перенаправлялся на http://host/dir1/dir2/dir3/index.php .
Пишу  
 
RewriteEngine On  
 
RewriteCond %{REQUEST_URI} ^\/dir1\/dir2\/$
RewriteRule ^(.*)$ /~dir1/dir2/dir3/index.htm?%1 [R]
 
и всё вроде работает правильно, пользователь перенаправляется.
Но вот я захотел сделать это правило более универсальным, что бы не прописывать пути в нескольких местах при переносе с хостинга на хостинг, а прописывать путь только в одном месте, в RewriteBase.  
Пишу
 
RewriteEngine On  
 
RewriteBase /dir1/dir2/
 
RewriteCond %{REQUEST_URI} ^\/$
RewriteRule ^(.*)$ dir3/index.htm?%1 [R]
 
Не работает.  
В чём ошибка?

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 00:48 05-07-2010 | Исправлено: israel_rider, 01:34 05-07-2010
substrackto

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
israel_rider
не понял как оно у вас работает, но может быть ошибка в: RewriteCond, если уже изменилась базовая точка отсчета(RewriteBase), то от нее нужно все запросы перенаправлять.
Тоесть убрать вообще RewriteCond, или изменить в базе /dir1/dir2, а в RewriteCond дописать что может быть закрывающий слэш.
 
RewriteBase /dir1/dir2
RewriteCond %{REQUEST_URI} ^(\/?)$

Всего записей: 93 | Зарегистр. 25-10-2007 | Отправлено: 01:09 06-07-2010
israel_rider

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
К сожалению, изучив внимательно документацию, я пришёл к выводу, что моя идея в принципе не верна.
Дело в том, что там написано, что действие RewriteBase распостраняется только на RewriteRule, и не распостраняется на RewriteCond. То есть получается, что в моём случае использование  RewriteBase бессмысленно.

Всего записей: 925 | Зарегистр. 28-07-2007 | Отправлено: 07:43 06-07-2010
Tstf



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Помоги реализовать следующее
 
Адрес вида продавец.site.com должен соответствовать site.com/продавец/
 
Как это через htaccess сделать? И возможно ли?

----------
Заработок 2.0

Всего записей: 788 | Зарегистр. 22-04-2003 | Отправлено: 19:53 09-07-2010
Cheery



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

Цитата:
Как это через htaccess сделать? И возможно ли?

htaccess тут поможет относительно.
для начала нужно прописать Wild Card для поддоменов в DNS
Затем настроить аналогично обработку любым поддоменов апачем..
и только потом уже возиться с mod_rewrite
 
 
http://en.wikipedia.org/wiki/Wildcard_DNS_record
http://steinsoft.net/index.php?site=programming/articles/apachewildcarddomain
и все.. потом в корне htaccess в котором смотреть
   RewriteCond %{HTTP_HOST} !www.domain.com$ [NC]
   RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).domain.com [NC]
   RewriteRule (.*) %2/$1 [L]

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:34 09-07-2010 | Исправлено: Cheery, 22:59 09-07-2010
Apart

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Проблема с закрывающим слэшем:  
 
Есть сайт с доменами типа  
site.ru и site.com, которые на шаред-хостинге привязаны на 1 папку (чтобы для каждого по отдельному субдомену не создавать, тем более, что на site.com совсем немного страниц для англоязычных пользователей)
 
Основной сайт на русском - site.ru с кучой файлов и папок, где есть такой htaccess
 
===
Options +Includes +FollowSymLinks -Indexes
AddHandler server-parsed .shtml .html
DirectoryIndex index.shtml index.htm index.php index.html
AddDefaultCharset windows-1251
CookieTracking on
CookieExpires "1 years"
 
RewriteEngine on
 
RewriteRule ^siteen/ - [L]
RewriteCond %{HTTP_HOST} (www\.)?site\.com [NC]
RewriteRule (.*) siteen/$1 [L]
===
 
Папка /siteen/ создана для размещения там файлов на английском языке и чтобы контент оттуда показывался, если юзер заходит на адрес site.com (а не site.ru)
 
В самой папке /siteen/ есть htaccess с таким содержимым
===
Options +Includes +FollowSymLinks -Indexes
AddHandler server-parsed .shtml .html
DirectoryIndex index.shtml index.htm index.php index.html
AddDefaultCharset windows-1251
CookieTracking on
CookieExpires "1 years"
 
RewriteEngine on
 
ErrorDocument 404 http://www.site.com
===
 
 
В папке /siteen/ есть подпапки типа /profile/, /news/ и т.п., где лежат файлы index.html и пр.
 
 
В чем проблема:  
 
когда набираешь в браузере адрес site.com/profile/ с закрывающим слэшем, то все нормально отображается
 
когда набираешь в браузере адрес site.com/profile без закрывающего слэша, то контент опять же показывается нормальный, но в браузере при этом строка начинает выглядеть как site.com/siteen/profile/
 
Т.е. появляется название папки (и закрывающий слэш в конце). Закрывающий слэш появляется или нет - без разницы, но вот названия папки не хотелось бы, чтобы было видно в адресе.
 
Что нужно поменять, чтобы нормально работало? Перепровобал различные варианты, пока не получилось.
 
При этом если вбивать титульную страницу site.com без слэша и site.com/ со слэшем, то в обоих вариантах они нормально показываются, а папка в адрес не добавляется.
 
 
 

Всего записей: 409 | Зарегистр. 10-05-2005 | Отправлено: 20:35 11-07-2010
Tutankhamon86



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый вечер
 
Пожалуйста подскажите как можно реализовать перенаправление с кодом 301 для:
 
http://site.com/co_by_01/<разные файлы> -> http://subdomen.site.com/co_by_01/<разные файлы>
http://site.com/co_by_02/<разные файлы> -> http://subdomen2.site.com/co_by_02/<разные файлы>
http://site.com/wa_by_01/<разные файлы> -> http://subdomen.site.com/wa_by_01/<разные файлы>
http://site.com/wa_by_02/<разные файлы> -> http://subdomen2.site.com/wa_by_02/<разные файлы>
 
Заранее спасибо

Всего записей: 225 | Зарегистр. 20-05-2008 | Отправлено: 20:52 20-08-2010
DmitryV



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста - задача оставить достум к сайту с 1-2 IP адресов ко всем ресурсам сайта, при запросе ресурсов любых со всех остальных IP показать страницу например test.htm в корне сайта.

Всего записей: 1254 | Зарегистр. 12-01-2003 | Отправлено: 20:18 29-08-2010 | Исправлено: DmitryV, 20:35 29-08-2010
spin5

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сайт сделан на Flash, проиндексирован Yandex.
 
1)
По поисковому запросу выдает ссылку непосредственно на один из *.swf файлов в каталоге.
Но, необходимо, чтобы поисковики (Yandex) по прежнему индексировали подобные файлы, а пользователь по ссылке, указанной Yandex (напр. .../intro.swf) попадал бы только на главную страницу - index.php.
 
Прочитал про конфигурирование .htaccess и mod_rewrite все, но, все равно возникают вопросы, так как главного - опыта, не хватает.
 
Подскажите, плз, как исправить.
 
2)
Если написать с условием, то такая задача для меня представляет некоторую трудность. Правильно ли будет так (взято из примера для запрета просмотра сайта, кроме поисковых роботов):

Код:
RewriteEngine on
RewriteBase   /
RewriteCond %{HTTP_USER_AGENT} !^yandex.* [NC,OR]    
RewriteCond %{HTTP_USER_AGENT} !^googlebot.* [NC,OR]    
RewriteCond %{HTTP_USER_AGENT} !^.*gaisbot.* [NC,OR]    
RewriteCond %{HTTP_USER_AGENT} !^rambler.* [NC,OR]    
RewriteCond %{HTTP_USER_AGENT} !^aport.* [NC,OR]    
RewriteCond %{HTTP_USER_AGENT} !^metacrawler.* [NC,OR]    
RewriteCond %{HTTP_USER_AGENT} !^msnbot.* [NC,OR]    
RewriteCond %{HTTP_USER_AGENT} !^.*crawler.* [NC]    
RewriteRule ^intro.swf$ index.php [NC,L]
 

3)
Если я правильно понимаю, все условия RewriteCond в данном примере - это исключения (символ '!') тех UserAgent-ов, для которых правило применяться не будет?
Но, в таком варианте - не работает.
4)
Если последняя строка
Код:
RewriteRule ^(.swf)$ index.php [L]
-тоже.
5)

Код:
RewriteRule ^(.*)$ http://www.mysite.ru/index.php [L]
- пишет ошибку:
Код:
Found
The document has moved here.
Apache/2.2.15 (Unix) mod_ssl/2.2.15 OpenSSL/0.9.8e-fips-rhel5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 Server at www.mysite.ru Port 80

5)
А так:
Код:
RewriteRule ^(.*)$ http://www.mysite.ru/[L]
- цикл.
 
6) Перенаправить необходимо только с *.swf файлов.
 
7)Однако...  ...если создать такое правило, не помешает ли оно самому файлу index.php грузить в себя intro.swf???

Всего записей: 65 | Зарегистр. 11-01-2008 | Отправлено: 16:04 06-09-2010 | Исправлено: spin5, 23:59 12-02-2011
azema

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день, господа!
У меня вопрос: можно ли средствами mod_rewrite прописать выражение для редиректа 301 с одного сайта на другой, конкретнее - с domen_hostera.ru/site.ru на просто site.ru?!  
Просто мой сайт проиндексирован в 2-х вариантах и хотелось бы убрать неглавное зеркало (domen_hostera.ru/site.ru). Принимаются также другие варианты, помогите пожалуйста!!!

Всего записей: 25 | Зарегистр. 04-02-2010 | Отправлено: 00:32 16-09-2010
Открыть новую тему     Написать ответ в эту тему

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