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

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



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пожалуйста подскажите как сделать редирект только главного домена на другой хост а все поддомены отставить не тронутыми?

Всего записей: 225 | Зарегистр. 20-05-2008 | Отправлено: 16:35 11-03-2010
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Tutankhamon86
Используя RewriteCond

Код:
RewriteCond %{HTTP_HOST}  main.example.com
RewriteRule ^.*$ http://other.example.net [NS,L,R]

 
Добавлено:
bazzjr
Не понял ваш вопрос. Логику преобразования
Цитата:
RewriteRule  ^search/((([a-z0-9]+)=([^/]*)/)+) bin/myscript.php?vars=$1  
или почему
Цитата:
AJAX-запросы в адресной строке никак не светятся.

?

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 16:46 11-03-2010
bazzjr

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
dacuan
 
Вопрос следующий:
 
Если пользователь ввел в адресную строку адрес вида - http://site.ru/?a=1&b=2
То есть ли возможность перенаправить его на страницу http://site.ru/search/?a=1&b=2 но при этом в адресной строке скрыть адрес http://site.ru/search/?a=1&b=2, а отобразить например http://site.ru/search/

Всего записей: 7 | Зарегистр. 09-02-2010 | Отправлено: 18:57 11-03-2010
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bazzjr
Можете поиграть с флагом [E=], но у меня с полпинка он не заработал. Если не получится, то запрос
http://site.ru/?a=1&b=2
может обрабатываться скриптом вида

Код:
<?php
session_start();
$_SESSION["QS"] = $_SERVER["QUERY_STRING"];
header("Location: /search/");

 
а в обработчике запроса http://site.ru/search/ читать переменную QS из сессии.

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 10:37 12-03-2010
Tutankhamon86



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

Цитата:
Используя RewriteCond  

Спасибо

Всего записей: 225 | Зарегистр. 20-05-2008 | Отправлено: 11:36 12-03-2010
MeatNyx

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте. Уже третий день парюсь, ничего не могу поделать.
Делаю ЧПУ с помощью mod_rewrite.
Мне нужно, чтобы ссылки site.ru/ru/page ссылались на index.php?lang=ru&page=page
При отсутствии последней переменной пусть посылается только одна.
 
.htaccess:
 
DirectoryIndex /ru/
 
RewriteEngine On
RewriteBase /
 
RewriteRule ^([A-Za-z]+)/?$ index.php?lang=$1 [L]
RewriteRule ^([A-Za-z]+)/([A-Za-z]+)/?$ index.php?lang=$1&page=$2 [L]
 
все хорошо, переменные присылаются, но также подменяются и папки, тоесть при запросе site.ru/ru/about/
 
мы какбы находимся в папке ru/about.
Со всеми вытекающими: не находит страницы и стили.
Заранее благодарен)

Всего записей: 2 | Зарегистр. 06-07-2008 | Отправлено: 06:56 30-03-2010
Cheery



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

Цитата:
мы какбы находимся в папке ru/about.  
Со всеми вытекающими: не находит страницы и стили

ну так прописывайте пути к стилям от корня сайта

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 07:02 30-03-2010
droZel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
пути к стилям прописаны:     
<link rel="stylesheet" href="../mystyle.css" type="text/css" />
 
и еще site.ru/ru превращается прям в строке в http://site.ru/ru/?lang=ru
 
Разве суть реврайта не в том, что он преоразует эти папки в переменные? Почему папки как таковые остаются? Я не понимаю суть, или я неправильно прописал реврайт?
 
(это я meatnyx, буду писать под этим профилем)

Всего записей: 2 | Зарегистр. 17-12-2009 | Отправлено: 07:06 30-03-2010 | Исправлено: droZel, 07:13 30-03-2010
SKi

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте.  
Помогите отучить mod_rewrite ползать по папкам.
 
.htaccess

Код:
 
RewriteEngine On
RewriteBase /
RewriteRule ^(\w+)/(\d+)/$ index.shtml?mod=$1&id=$2 [L]
 

 
Всё прекрасно работает, но в логе ужас. Он пытается подставить аргументы куда не лень:

Код:
 
[nord/sid#e05fe8][rid#20d2a08/initial] (3) [perdir C:/home/n/nord/www/] strip per-dir prefix: C:/home/n/nord/www/img/closelabel.gif -> img/closelabel.gif
127.0.0.39 - - [07/Apr/2010:22:53:20 +0300] [nord/sid#e05fe8][rid#20d2a08/initial] (3) [perdir C:/home/n/nord/www/] applying pattern '^(\w+)/(\d+)/$' to uri 'img/closelabel.gif'
127.0.0.39 - - [07/Apr/2010:22:53:20 +0300] [nord/sid#e05fe8][rid#20d2a08/initial] (1) [perdir C:/home/n/nord/www/] pass through C:/home/n/nord/www/img/closelabel.gif
 

 
Как побороть?
 
Добавлено:
Есть подозрение, что он это берёт из /css/style.css

Всего записей: 124 | Зарегистр. 17-04-2004 | Отправлено: 00:23 08-04-2010
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SKi
Это его нормальное поведение. mod_rewrite пытается обработать все запросы к апачу включая картинки, css и прочее.

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 16:43 08-04-2010 | Исправлено: dacuan, 16:47 08-04-2010
SKi

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

Код:
 
RewriteEngine On
RewriteOptions Inherit
RewriteBase /
RewriteCond %{REQUEST_URI} !^favicon.ico
RewriteCond %{REQUEST_URI} !^img/.*
RewriteCond %{REQUEST_URI} !^images/.*
RewriteCond %{REQUEST_URI} !^css/.*
RewriteCond %{REQUEST_URI} !^js/.*
RewriteCond %{REQUEST_URI} !^cgi-bin/.*
RewriteRule ^([a-z]+)/([0-9]+)/?$ /index.shtml?mod=$1&id=$2 [NS]
 

Если у меня добавится 3-ий параметр &Page=1, будет ли корректно такое решение:

Код:
 
RewriteEngine On
RewriteOptions Inherit
RewriteBase /
RewriteCond %{REQUEST_URI} !^favicon.ico
RewriteCond %{REQUEST_URI} !^img/.*
RewriteCond %{REQUEST_URI} !^images/.*
RewriteCond %{REQUEST_URI} !^css/.*
RewriteCond %{REQUEST_URI} !^js/.*
RewriteCond %{REQUEST_URI} !^cgi-bin/.*
RewriteRule ^([a-z]+)/([0-9]+)/?$ /index.shtml?mod=$1&id=$2 [NS]
#######
RewriteCond %{REQUEST_URI} !^/index.shtml/.*
RewriteRule ^([a-z]+)/([0-9]+)/([0-9]+)/?$ /index.shtml?mod=$1&id=$2&PAGE=$3 [NS]
 

 
Добавлено:
Так даже лучше:

Код:
 
RewriteEngine On
RewriteOptions Inherit
RewriteBase /
RewriteCond %{REQUEST_URI} !^favicon.ico
RewriteCond %{REQUEST_URI} !^img/.*
RewriteCond %{REQUEST_URI} !^images/.*
RewriteCond %{REQUEST_URI} !^css/.*
RewriteCond %{REQUEST_URI} !^js/.*
RewriteCond %{REQUEST_URI} !^cgi-bin/.*  
RewriteRule ^([a-z]+)/([0-9]+)/?$ /index.shtml?mod=$1&id=$2 [S=1,NS]
RewriteRule ^([a-z]+)/([0-9]+)/([0-9]+)/?$ /index.shtml?mod=$1&id=$2&PAGE=$3 [NS]
 

 
Добавлено:
Подсократим:

Код:
 
RewriteCond %{REQUEST_URI} !^(favicon.ico|img/.*|images/.*|css/.*|js/.*|cgi-bin/.*)
 

Всего записей: 124 | Зарегистр. 17-04-2004 | Отправлено: 01:48 09-04-2010
OLEX



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Драсьте.
 
Есть сайт, к примеру site.ru на котором в .htaccess есть куча правил.
Создан поддомен, sub.site.ru , который физически находится в папке sub , которая лежит в корне site.ru , и все запросы к sub.site.ru обрабатываются правилами из site.ru .
Как от этого избавиться?

----------
Отче Наш, иже еси в моем PC. Да святится имя и расширение Твоё. ENTER.

Всего записей: 3590 | Зарегистр. 09-07-2002 | Отправлено: 03:50 20-04-2010
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OLEX
добавить
RewriteCond %{HTTP_HOST} ^site\.ru$  


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

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ммм... все равно обрабатывется..
 
вот это
RewriteCond %{HTTP_HOST} ^site\.ru$  
нужно прописывать перед каждым RewriteRule ?
 
Добавлено:
у меня изначально ни одного RewriteCond не было

Всего записей: 3590 | Зарегистр. 09-07-2002 | Отправлено: 04:10 20-04-2010
Cheery



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

Цитата:
нужно прописывать перед каждым RewriteRule ?

да

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

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
да уже понял, прописал перед основными директивами, заработало, большое спасибище!

Всего записей: 3590 | Зарегистр. 09-07-2002 | Отправлено: 04:22 20-04-2010
Qwezar



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Сори если был такой вопрос.
 
Как сделать, чтобы mod_rewrite отличал физический файл от преобразованного? Структура файла .htaccess следующая:

Код:
 
RewriteEngine on
RewriteCond %{HTTP_HOST} ^mysite.ru
RewriteRule (.*) http://www.mysite.ru/$1 [R=301,L]
RewriteRule ^(.*).html$ index.php?id=$1
 

 
На севрере лежит файл file.html, который должен открываться как физический, но mod_rewrite пытается его преобразовать. Как переписать .htaccess?

Всего записей: 360 | Зарегистр. 31-12-2006 | Отправлено: 10:21 21-05-2010 | Исправлено: Qwezar, 10:28 21-05-2010
dacuan

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

Цитата:
Как сделать, чтобы mod_rewrite отличал физический файл от преобразованного? Структура файла .htaccess следующая:

Используй флаги -f для файла и -d для каталога

Код:
RewriteEngine on  
RewriteCond %{HTTP_HOST} ^mysite.ru  
RewriteRule (.*) http://www.mysite.ru/$1 [R=301,L]
 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*).html$ index.php?id=$1

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 10:36 21-05-2010
Qwezar



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
dacuan
 
Спасибо! =)

Всего записей: 360 | Зарегистр. 31-12-2006 | Отправлено: 11:33 21-05-2010
Shader



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

Код:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://www.yourdomain.com [NC]
RewriteRule .*\.(jpg|jpeg|gif|mp3|png|bmp|xml)$ - [NC,F]

 
После этого столкнулся с тем, что если открывать сайт в опере и открыть просмотр любого изображения, то можно к этому изображению обратиться напрямую и опера его исправно покажет, взяв из кэша. Решилось добавлением следующих строк:
 

Код:
<FilesMatch "\.(jpg|jpeg|gif|mp3|png|bmp|xml)$">
Header set Pragma "no-cache"
Header set Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
Header set Expires "Sun, 19 Nov 1978 05:00:00 GMT"
</FilesMatch>

 
Теперь опера не выпендривалась и реагировала на RewriteRule, не пытаясь подгрузить картинку из кэша. Но всплыла другая проблема, которую решить пока не могу. Firefox абсолютно наплевательски относится к HTTP-REFERRER и отказывается работать с этим антиличем. Даже когда картинки подгружаются скриптом, реферрер не передаётся. IE, Opera и Chrome работают корректно.
 
Это опера:

Код:
GET /content/pictures1/sunset%2Ejpg HTTP/1.1" 304 - "http://www.yourdomain.com/gallery/imagevue.swf" "Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.5.24 Version/10.53"

 
Это фаерфокс:

Код:
"GET /content/pictures1/sunset%2Ejpg HTTP/1.1" 403 306 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 WebMoney Advisor"

 
Посоветуйте, пожалуйста, как закрыть файлы в папке контента от прямого доступа, или как бороться с ФФ?

Всего записей: 54 | Зарегистр. 14-09-2003 | Отправлено: 11:36 23-05-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