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

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

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Tonyas
Дело в том, что mod_rewrite не позволяет оперировать более чем 9-ю переменными. Так что придется искать другой путь передачи параметров, например, анализировать URL  в скрипте.

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 17:05 22-02-2008
Tonyas



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

Цитата:
Tonyas  
Дело в том, что mod_rewrite не позволяет оперировать более чем 9-ю переменными. Так что придется искать другой путь передачи параметров, например, анализировать URL  в скрипте.

я нашла на англоязычном форуме, что можна вот так реализовать
 

Цитата:
Nine parameters is the limit *per rewriterule*.  
RewriteCond and rewriterule can each create nine back-references, %1-%9 and $1-$9 respectively.  
You may be able to use chained rules, with the first rule doing part of the rewrite, and the second rule finishing the rest. See the the rewriterule [C] flag.  
Your pattern can be re-written for much more efficient processing using a "one or more characters not equal to a slash" subpattern like this:  
 
rewriterule ^([1-9]В¦1[01])/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^.]+)\.html$ temp/$6?lid=$1&$2=$3&$4=$5 [C]  
rewriterule ^temp/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]*)\.html$ index.php?$1=$2&$3=$4&$5=$6 [QSA,L]  
 
The temporary pathname 'temp' is arbitrary -- change it in both rules if you like.  
 

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

Всего записей: 10 | Зарегистр. 20-02-2008 | Отправлено: 17:15 22-02-2008 | Исправлено: Tonyas, 17:16 22-02-2008
dacuan

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

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

А как выглядело именно Ваше правило?
 

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 18:07 22-02-2008
Tonyas



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rewriterule ^([a-z_0-9\.\-]{3,40})/([a-z_0-9\.\-]{3,40})/([0-9]+)/([0-9]+)/([0-9]+)/(.*)/l.gif$ temp/$6?a=$1&b=$2&c=$3&d=$4&e=$5 [C]  
rewriterule ^temp/([0-9]+)/([0-9]+)/([0-9]+)/([0-9]+)/(.*)/([0-9]+)/l.gif$ file.php?&f=$1&k=$2&l=$3&m=$4&n=$5&o=$6&p=$7 [QSA,L]  

Всего записей: 10 | Зарегистр. 20-02-2008 | Отправлено: 18:53 22-02-2008
dacuan

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

Код:
rewriterule ^([a-z_0-9\.\-]{3,40})/([a-z_0-9\.\-]{3,40})/([0-9]+)/([0-9]+)/([0-9]+)/(.*)/l.gif$ temp/$6?a=$1&b=$2&c=$3&d=$4&e=$5 [C]  
rewriterule ^temp/([0-9]+)/([0-9]+)/([0-9]+)/([0-9]+)/(.*)/([0-9]+) file.php?&f=$1&k=$2&l=$3&m=$4&n=$5&o=$6&p=$7 [QSA,L]  

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 19:15 22-02-2008
Tonyas



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

Всего записей: 10 | Зарегистр. 20-02-2008 | Отправлено: 21:29 22-02-2008
Cheery



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

Цитата:
так тоже не работает

передавайте в скрипт всю строку запроса и в нем разбивайте как вам будет удобнее

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:40 22-02-2008
Delphi6



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

Цитата:
Дело в том, что mod_rewrite не позволяет оперировать более чем 9-ю переменными.

А я даже не знал (правда никогда не приходилось столько параметров передавать).  
 
Tonyas
А что если сделать пошаговую конвертацию? (конечно я бы предпочел метод предложенный Cheery) Ну допустим пропарсить часть урла и средирекнуть ([R=301,L]) да так что бы его потом заново поймало но уже второе правило, а оно уже в свою очередь допарсило бы все до конца ...

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 23:39 22-02-2008 | Исправлено: Delphi6, 23:40 22-02-2008
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ой ... я только что заметил что вы нашли как раз такое решение (цитата на английском языке).

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 01:40 23-02-2008 | Исправлено: Delphi6, 01:49 23-02-2008
Tonyas



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

Всего записей: 10 | Зарегистр. 20-02-2008 | Отправлено: 09:49 23-02-2008
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Tonyas
А вот и рабочий вариант. Правда пришлось часок поэкспериментировать

Код:
RewriteEngine On
RewriteBase /
RewriteRule ^folder/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/(.*)/l.gif$ temp/$8/?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7 [C]
RewriteRule ^temp/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/(.*)$ /ru-board/tonyas/file.php?h=$1&i=$2&j=$3&k=$4&l=$5 [QSA,L]
 

А вот можно увидеть на практике:
http://proxy-list.org/ru-board/tonyas/folder/1f/1f/1/1/2006/xxxx/7/1/1/2003/xxx/7/l.gif
 
p.s. файл .htaccess лежит в дире /www/ru-board/tonyas

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 14:57 23-02-2008 | Исправлено: Delphi6, 14:58 23-02-2008
Tonyas



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

Всего записей: 10 | Зарегистр. 20-02-2008 | Отправлено: 17:21 23-02-2008
MaxTax



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите пожалуйста с проблемой! Переехал на новый хостинг и перестали работать некоторые инструкции mod_rewrite
 
Хотя на предыдущем и у меня на локале все работает, не могу понять в чем проблема
 
RewriteRule ^article/([0-9]+).html$ article.php?id=$1 [L] #не работает
RewriteRule ^print/([0-9]+).html$ print.php?id=$1 [L]  #не работает
RewriteRule ^rss(/?)$ rss.php [L]  #работает
RewriteRule ^arhiv(/?)$ arhiv.php [L]  #работает
RewriteRule ^arhiv/p_([0-9]+).html$ arhiv.php?p=$1 [L]  #не работает
RewriteRule ^([a-z]+)(/?)$ section.php?alias=$1 [L]  #не работает

Всего записей: 103 | Зарегистр. 20-08-2003 | Отправлено: 10:57 02-03-2008
andead



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MaxTax
попробуй в начала htaccess написать

Код:
Options +FollowSymLinks -MultiViews

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 18:02 02-03-2008
MaxTax



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
andead
Не помогло, и то что работало перестало обрабатываться

Всего записей: 103 | Зарегистр. 20-08-2003 | Отправлено: 19:53 02-03-2008
roma572



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

Всего записей: 409 | Зарегистр. 30-03-2002 | Отправлено: 14:15 18-03-2008
Cheery



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

Цитата:
Подскажите такое решение, чтобы пользователь, кликнув на ссылку с нужного сайта получал файл (с возможностью использовать менеджеры закачек), а с любого другого сайта

любой менеджер закачек подставляет реферером ту папку, в которой лежит файл
например, без mod_rewrite

Код:
 SetEnvIfNoCase Referer ^http://site\.ru getout
<Directory ...>
    Order deny,allow
    Deny from all env=getout
    Allow from all
</Directory>  

 
можно с помощью mod_rewrite аналогично перебрасывать на страницу с каким то текстом
 
ps: директива directory для httpd.conf.. без нее - в htaccess

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 17:29 18-03-2008 | Исправлено: Cheery, 17:30 18-03-2008
karterfree

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Такой вопрос. Есть .htaccess с содержанием:
 
------------------------------
DirectoryIndex index.php
Options -Indexes  
 
RewriteEngine On
RewriteBase /
 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
 
RewriteRule ^tiket index.php?modul=tiket
RewriteRule ^tiket/(.*)$ index.php?modul=tiket&page=$1
 
RewriteRule ^news index.php?modul=news
RewriteRule ^news/(.*)$ index.php?modul=news&page=$1
 
RewriteRule ^docs index.php?modul=docs
RewriteRule ^docs/(.*)$ index.php?modul=docs&page=$1
 
RewriteRule ^guide index.php?modul=guide
RewriteRule ^guide/(.*)$ index.php?modul=guide&page=$1
 
RewriteRule ^files index.php?modul=files
RewriteRule ^files/(.*)$ index.php?modul=files&page=$1
 
RewriteRule ^mypage index.php?modul=mypage
RewriteRule ^mypage/(.*)$ index.php?modul=mypage&page=$1
 
ErrorDocument 404 /index.php?modul=404
ErrorDocument 403 /index.php?modul=403
----------------------------------------------------------
 
Такие правила были поставлены что бы ссылки
http://localost/tiket/ перенаправлялись на http://localost/index.php?modul=tiket
 
Но вот проблема:  
У меня появился дополнительный модуль http://localost/techspec/
Лежит по адресу http://localost/techspec/index.php
но когда я иду по адресу http://localost/techspec/ то попадаю на http://localost/index.php
 
Как дописать или переписать правила что бы  
http://localost/techspec/ перенаправлялся на http://localost/techspec/index.php (соответственно с сss и т.д.)  
а http://localost/tiket/,  http://localost/news/ и т.д. перенаправлялись на http://localost/index.php

Всего записей: 1 | Зарегистр. 24-03-2008 | Отправлено: 22:12 24-03-2008
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
karterfree
добавить
RewriteCond %{REQUEST_URI} !^/techspec/

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:09 24-03-2008 | Исправлено: Cheery, 23:09 24-03-2008
Pirates



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Честно прочитал всю ветку, надеясь натолкнуться на решение своей проблемы. Вокруг да около разговоров много, но поскольку ни разу не программер, выжать для себя решение не смог. Перепробовав не один десяток вариантов, сдался и повторяю здесь свою просьбу, ранее опубликованную в соседней ветке:
 
 
В данный момент на домене http://domain.ru/ работает конструкция, которая при попытке вызова несуществующего урла (http://domain.ru/some.php, http://domain.ru/some.html, http://domain.ru/some/) скидывает на главную страницу:  
 

Цитата:
RewriteEngine on  
RewriteCond %{REQUEST_URI} \.shtml?$    
RewriteRule ^(.*)\.shtml?$ $1.php [L]  
RewriteEngine off  

 
Теперь требуется, чтоб и при вызове несуществующего сабдомена (http://some.domain.ru/) происходил редирект на главную страницу.  
 
Как это сделать корректно?  
 
Спасибо!

Всего записей: 104 | Зарегистр. 16-02-2004 | Отправлено: 02:30 31-03-2008
Открыть новую тему     Написать ответ в эту тему

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