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

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

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
еще раз
читать не менее внимательно
забудьте про index.php
http://domain.com/?id=777
http://domain.com/?id=778
для google - эти две ссылки ведут на разные сайты
при помощи 301 редиректа я могу их склеить
что не понятно?

Всего записей: 4 | Зарегистр. 13-05-2008 | Отправлено: 22:17 15-05-2008
Cheery



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

Цитата:
что не понятно?  

зачем вам htaccess с mod_rewrite?


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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:23 15-05-2008
crimea360

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет.  
 
вот эти 3 типа динамических страниц
http://www.domen.com/index1.php?id=7
http://www.domen.com/category.php?id=59
http://www.domen.com/category.php?id=2&offset=130&sort=1&order=1
а статику для них соответственно хотелось бы видеть в таком виде:
 
http://www.domen.com/index-1-7.htm
http://www.domen.com/category-59.htm
http://www.domen.com/category-2-130-1-1.htm
 
Этого я добился написав такие правила
 
RewriteRule ^category-([^-]*)-([^-]*)-([^-]*)-([^-]*)\.htm$ /category.php?id=$1&offset=$2&sort=$3&order=$4 [L]
RewriteRule ^category-([^-]*)\.htm$ /category.php?id=$1 [L]
RewriteRule ^index-1-([^-]*)\.htm$ /index1.php?id=$1 [L]
 
 
Теперь не могу придумать как сделать так чтобы когда заходишь по старым ссылкам  
http://www.domen.com/index1.php?id=7
они автоматически редиректились  
http://www.domen.com/index-1-7.htm
 
Попробовал вот так
 
RewriteCond %{REQUEST_URI}  ^/index1.php
RewriteCond %{QUERY_STRING}  ^id=([^/]*)  
RewriteRule ^$   index-1-%1.htm? [L,R=301]  
 
Но не работает -(((
 
 
 
Может кто подскажет?

Всего записей: 29 | Зарегистр. 03-01-2007 | Отправлено: 16:03 29-05-2008 | Исправлено: crimea360, 16:04 29-05-2008
Cheery



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

Цитата:
Может кто подскажет?

в index.php смотрим - если есть $_SERVER["REDIRECT_URL"], то значит произошел переход через mod_rewrite
если нету - перекидываешь куда хочешь

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:54 29-05-2008
crimea360

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не понял причем сдесь index.php, он вызывается только когда человек заходит на главную и в редиректе вообще не участвует
 
Необходимо  чтобы
http://www.domen.com/index1.php?id=7  
 автоматически редиректились  
http://www.domen.com/index-1-7.htm  
 
И необходимо это сделать в файле .htaccess
 

Всего записей: 29 | Зарегистр. 03-01-2007 | Отправлено: 11:24 30-05-2008
Cheery



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

Цитата:
Не понял причем сдесь index.php

блин.. ну в ссылке он же есть?

Цитата:
http://www.domen.com/index1.php?id=7  

 

Цитата:
И необходимо это сделать в файле .htaccess  

зачем так извращаться???  
вы же все равно хотите, чтобы переадресация шла явным образом через 302 или 301
 
в php вы это сделаете двумя строчками.
 
ну хотите по своему.. так делайте
Под это не подойдет ни один ресурс

Цитата:
RewriteRule ^$   index-1-%1.htm? [L,R=301]  

RewriteRule ^.*$   index-1-%1.htm?

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 18:19 30-05-2008 | Исправлено: Cheery, 21:05 30-05-2008
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Извините, если обсуждалось, не нашел.
Ситуация:
Есть Seditio CMS, заточенная под работу с одним уровнем вложенности. Все ссылки типа "plug.php?e=search" или "skins/skin/skin.css", т.е. без начального "/".
Соответственно ссылки со страниц вроде "/archive/news" работать не будут. Первое, что приходит в голову:
RewriteBase /
RewriteRule ^/{0}(.*)$ $1
. Но это зацикливает ссылку. Больше мыслей нет. Посоветуйте, что можно сделать.

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:32 31-05-2008
PEDKA



Улыбающийся КС
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Попробуй поставить в <head> до подключения стилей:

Код:
<base href="[SITE_URL]" />

Тогда все ссылки, в которых не указан протокол (начинаются не с http://, ftp:// и т.д.) будут относительно значения [SITE_URL], т.е. [SITE_URL]/skins/skin/skin.css

----------
вот такая вот батва ©...
"Тестирование" это давно уже не помойка.
"Тестирование" это филиал "Помощи" ©

Всего записей: 15958 | Зарегистр. 04-05-2003 | Отправлено: 11:19 01-06-2008 | Исправлено: PEDKA, 12:06 04-06-2008
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
PEDKA
Спасибо, заработало! Помогло даже там, где начальный слеш уже есть. Буду теперь знать. На AlphaImageLoader это, правда не влияет, пришлось прописывать вручную.

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:40 01-06-2008
j0

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день. Нужно создать правило такого вида:  
чтобы news.php?action=add заменялось на news/add/. Нашел вот такой пример:  
RewriteEngine on  
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule news/([^/]+)? news.php?action=$1 [L]  
Все прекрасно заменяется, но пропадают все картинки и отваливаются стили. Подскажите как исправить.
Как вариант можно использовать <base>, но не очень охото править файлы при переносе с локалхоста.
Заранее благодарен.

Всего записей: 2 | Зарегистр. 12-07-2007 | Отправлено: 11:49 04-06-2008 | Исправлено: j0, 11:57 04-06-2008
PEDKA



Улыбающийся КС
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
j0

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

Либо ставить base href (см. на два поста выше), либо у всех ссылок, картинок и стилей в самом начале пути ставить «/».

----------
вот такая вот батва ©...
"Тестирование" это давно уже не помойка.
"Тестирование" это филиал "Помощи" ©

Всего записей: 15958 | Зарегистр. 04-05-2003 | Отправлено: 11:59 04-06-2008
Apart

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужно, чтобы когда при обращении к сайту получаем Error 404 (File Not Found), то показывалась какая-нибудь страница (без редиректа).  
 
Такой вариант не работает
 
ErrorDocument 404 /errorpage.html
 
 
Такой вариант работает, но при этом осуществляется редирект на http://www.mydomain.ru/errorpage.html
 
ErrorDocument 404 http://www.mydomain.ru/errorpage.html
 
 
Также я пробовал разные варианты через RewriteRule, например,  
 
RewriteRule ^(*.)$ errorpage.html [L,R=404]
 
но они или не работают (500 Error), или пишут "RewriteRule: invalid HTTP response code for flag 'R'"
 
 
Проблема в том, что если на одной папке есть два-три домена (.mydomain.ru, .mydomain2.ru, .mydomain3.ru), то не очень хорошо, если будет осуществляться редирект на один из них - http://www.mydomain.ru/errorpage.html  
Нужно просто, чтобы показывался errorpage.html для любого домена на этой папке. Как это сделать?

Всего записей: 409 | Зарегистр. 10-05-2005 | Отправлено: 01:53 10-06-2008
Cheery



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

Цитата:
Также я пробовал разные варианты через RewriteRule, например,  

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /errorpage.html
или же
Нестандартные страницы ошибок (404, 401 и др.)

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 02:07 10-06-2008
Apart

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery, судя по всему дело в настроках Apache или как еще это объяснить? Работает только вариант с абсолютным указанием адреса ErrorPage
 
Не прокатывает даже указание полного относительного пути к файлу (в том же AuthUserFile он нормально работает)
 
Если указать
 
/user/www/errorpage.html, то errorpage.html не подгружается, а в логах  
[Tue Jun 10 02:57:00 2008] [error] [client 213.85.167.80] File does not exist: /user/www/page.html
 
А если указать без слеша
user/www/errorpage.html, то в логах
 
[Tue Jun 10 02:50:05 2008] [error] [client 213.85.167.80] Invalid error redirection directive: user/www/errorpage.html
 
Если только попробовать там Perl-скрипт указать, но, наверное, на него тоже будет редиректиться..

Всего записей: 409 | Зарегистр. 10-05-2005 | Отправлено: 03:09 10-06-2008 | Исправлено: Apart, 03:12 10-06-2008
Cheery



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

Цитата:
File does not exist: /user/www/page.html  

вроде указывается другой файл
 
насколько понимаю - файлы должны быть в пределах директорий, доступных через браузер
настройки того же апача делают алиас для папки с error файлами


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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 03:17 10-06-2008
Apart

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, вот еще вывод на HTML-странице:
 
Not Found
The requested URL /page.html was not found on this server.
 
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.  
 
 
Но ведь относительный адрес указан правильно, файл errorpage.html существует, а в логах по его поводу чисто в этом случае, только есть надпись про File does not exist: /user/www/page.html
 
 
Добавлено:

Цитата:
File does not exist: /user/www/page.html  
 
вроде указывается другой файл  
 
насколько понимаю - файлы должны быть в пределах директорий, доступных через браузер  
настройки того же апача делают алиас для папки с error файлами  

 
У меня errorpage.html находится в той же папке, что и index.html
 
Возможно, дело в том, что написано в htaccess ранее?  
 
А там есть надпись вида:  
RewriteCond %{HTTP_HOST} (www\.)?([a-z0-9-]+)\.info [NC]
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^(www\.)?([a-z0-9-]+)\.info(.*) $2page.html [L,QSA]
 
$2page.html - это и есть запросы к page.html в примере выше, которые зависят от адреса домена (я упростил, чтобы не писать на форуме $2-page.html).
 

Всего записей: 409 | Зарегистр. 10-05-2005 | Отправлено: 03:23 10-06-2008
Cheery



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

Цитата:
Возможно, дело в том, что написано в htaccess ранее?  

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

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 03:32 10-06-2008
TBFG



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Читал, читал, так ничего и не понял .
 
Помогите, пожалуйста.
 
Есть УРЛ вида:
 
а)http://site.com/?type=spb_hotels&id=89
б)http://site.com/?type=spb_hotels
 
Надо что бы юзер в строке браузер видел, соответственно
 
а)http://site.com/spb_hotels/89/
б)http://site.com/spb_hotels/

Всего записей: 584 | Зарегистр. 10-07-2004 | Отправлено: 17:47 11-06-2008
andead



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

Код:
RewriteEngine On
RewriteRule ^spb_hotels$ /spb_hotels/ [R=301,L]
RewriteRule ^spb_hotels/$ /?type=spb_hotels [L]
RewriteRule ^spb_hotels/([0-9]+)$ /spb_hotels/$1/ [R=301,L]
RewriteRule ^spb_hotels/([0-9]+)/$ /?type=spb_hotels&id=$1 [L]

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 22:22 11-06-2008
jkrus

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Люди, помогите! Никак не могу допереть, как преобразовать запрос вида user_name.site.ru в site.ru/blog/user_name/
Только user_name не директория, а формируется с помощью ЧПУ. Запрос без ЧПУ выглядит так: http://site.ru/blog/index.php?page=blog&blog=user_name
Помогите, очень надо.

Всего записей: 1 | Зарегистр. 13-06-2008 | Отправлено: 02:12 13-06-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