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

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



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
На хостинге в корне стоит сайт, другой поставили в поддиректорию.  
В .htaccess записано так:  
 
RewriteEngine On  
RewriteCond   %{REQUEST_FILENAME}   !-f  
RewriteRule   ^(.*)                 /index.php?QUERY=$1&%{QUERY_STRING} [L]  
 
Но при нем не открывается сайт из поддиректории, а пока нужно оставить старый и наполнить новый.  
Если файл убираешь - то сайт из поддомена открывается, но не работает основной.  
Как можно открыть доступ одновременно к двум сайтам ?

Всего записей: 146 | Зарегистр. 22-04-2002 | Отправлено: 22:12 27-06-2008
Cheery



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

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

добавить  
RewriteCond %{HTTP_HOST} ^subdomain

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

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



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добавление
RewriteCond   %{HTTP_HOST} ^сайт.ru/подпапка/
не помогает

Всего записей: 146 | Зарегистр. 22-04-2002 | Отправлено: 22:40 27-06-2008
Cheery



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

Цитата:
RewriteCond   %{HTTP_HOST} ^сайт.ru/подпапка/
не помогает

а может не надо отсебятины? я, вроде бы, указал что нужно..
 
указываем просто имя поддомена, для которого хотим применить.
или пишем так  
RewriteCond   %{HTTP_HOST} !^subdomain
для того, для которого не хотим, чтобы применялось

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:42 27-06-2008 | Исправлено: Cheery, 22:44 27-06-2008
AndreySm



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
При чем тут субдомен ?
сайт.ру все ведет на основной сайт
в подпапке /подпапка/ другой сайт
при оригинальном файле подпапка не открывается, с вашим добавлением не работает основной сайт - но подпапка открывается, как самого файла вообще нет.

Всего записей: 146 | Зарегистр. 22-04-2002 | Отправлено: 22:54 27-06-2008
Cheery



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

Цитата:
При чем тут субдомен ?

откуда я знаю какой "другой" сайт.. значит заменяете subdomain на имя другого сайта, но без пути и экранируя точки как \.   (хотя и необязательно)
 
я лишь добавил условие, чтобы mod_rewrite разбирался к какому имени сервера его применить..

Цитата:
RewriteEngine On  
RewriteCond   %{REQUEST_FILENAME}   !-f  
RewriteRule   ^(.*)                 /index.php?QUERY=$1&%{QUERY_STRING} [L]  
 
Но при нем не открывается сайт из поддиректории, а пока нужно оставить старый и наполнить новый.  
Если файл убираешь - то сайт из поддомена открывается, но не работает основной.  

 
глупость какая то.. данная запись проверяет лишь есть ли файл или нет и если нет, то перекидывает на index.php
 
если document_root для второго сайта настроен именно на подпапку, то он даже htaccess в этой внешней директории смотреть не будет
 
 
ps: или поясняйте свое "второй сайт".

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:56 27-06-2008 | Исправлено: Cheery, 23:00 27-06-2008
AndreySm



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
на одном домене 2 сайта
1. сайт.ру
2. сайт.ру/подпапка/
при оригинальном коде файла, который я привел - не открывает сайт.ру/подпапка/
с вашими подсказками не открывает ссылки с сайт.ру , но открывает сайт.ру/подпапка/
то же самое если просто удалить файл .htaccess
вроде понятно описал

Всего записей: 146 | Зарегистр. 22-04-2002 | Отправлено: 23:04 27-06-2008
Cheery



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

Цитата:
на одном домене 2 сайта

ну так не путайте людей.. это не "2 сайта".
 

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

приведенный код на это не влияет.
еще раз - он проверяет существует ли файл, который запрошен, и если нет, то перебрасывает на index.php
так что дело не в нем.

Цитата:
RewriteCond   %{REQUEST_FILENAME}   !-f  

вот это условие - не существует файл который запрошен
тогда выполняется это
 

Цитата:
RewriteRule   ^(.*)                 /index.php?QUERY=$1&%{QUERY_STRING} [L]  

любой запрос переходит в /index.php?QUERY=запрос&строка_запроса
 
 
можно попробовать добавить
RewriteCond   %{REQUEST_FILENAME}   !-d
это проверка есть ли директория с таким именем

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:08 27-06-2008 | Исправлено: Cheery, 23:13 27-06-2008
AndreySm



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
понятно, т.е. к доступу просто задавать имя начального файла сайта в подпапке
в течении работы не страшно, дальше тормозит - но работает
и RewriteCond   %{REQUEST_FILENAME}   !-d помогло
спасибо !

Всего записей: 146 | Зарегистр. 22-04-2002 | Отправлено: 23:26 27-06-2008
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что то не могу сообразить почему у меня циклиться mod_rewrite, может кто в курсе?

Код:
# rewrite subdomain requests to subdirectories except for www.example.com  
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/subdomains/
RewriteCond %{REQUEST_URI} !^/favicon.ico
RewriteCond %{REQUEST_URI} !^/404error.htm
RewriteCond %{HTTP_HOST} !^www\.sitename\.eu$ [NC]
RewriteCond %{HTTP_HOST} ^([^.]+)\.sitename\.eu$ [NC]
RewriteRule (.*) /subdomains/%1/$1 [L]
 
# redirect www.example.com/subdomains/<sub-domain>/<page> to <sub-domain>.example.com/<page>
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.+)\ HTTP/
RewriteRule ^subdomains/([^/]+)/(.*)$ http://$1.sitename.eu/$2 [R=301,L]
 
ErrorDocument 403 http://sitename.eu/404error.htm
ErrorDocument 404 http://sitename.eu/404error.htm
ErrorDocument 500 http://sitename.eu/404error.htm

проблема возникает только в одном случае, если обращаться к страничке которая не существует но через subdomain. Вот пример http://subdomain.sitename.eu/bla-bla.html, но если допустим взять http://sitename.eu/bla-bla.html все работает на ура и происходит redirect на bla-bla.html
 
Спасибо

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 14:27 08-07-2008 | Исправлено: Delphi6, 14:29 08-07-2008
Cheery



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

Цитата:
Что то не могу сообразить почему у меня циклиться mod_rewrite, может кто в курсе?

для таких вещей есть логирование действий mod_rewrite
включаем на время.. потом смотрим логи.
 
очевидно, что связано с перекидыванием на 404 страницу
 

Цитата:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.+)\ HTTP/  

странная запись

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

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



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

Цитата:
странная запись

Да я что-то тоже не могу понять Я этот кусок когда откуда-то скопировал и потом подредактировал под свои нужды, правда вот не помню зачем я оставил это строчку? ведь любой запрос которые отлавливает mod_rewrite автоматом идет через HTTP протокол...
 
Спасибо помогло Вот и ошибка, правда теперь не знаю как пофиксить...
http://sub.sitename.eu/bla-bla.html
или тоже самое что в оригинале
http://sitename.eu/subdomains/sub/bla-bla.html
mod_rewrite.log

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 20:39 08-07-2008 | Исправлено: Delphi6, 20:41 08-07-2008
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Delphi6
проблема в том, что в начале преобразует в /subdomains/..

Цитата:
RewriteCond %{REQUEST_URI} !^/subdomains/
RewriteCond %{REQUEST_URI} !^/favicon.ico
RewriteCond %{REQUEST_URI} !^/404error.htm
RewriteCond %{HTTP_HOST} !^www\.sitename\.eu$ [NC]
RewriteCond %{HTTP_HOST} ^([^.]+)\.sitename\.eu$ [NC]
RewriteRule (.*) /subdomains/%1/$1 [L]  

 
а потом обратно через 301

Цитата:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.+)\ HTTP/
RewriteRule ^subdomains/([^/]+)/(.*)$ http://$1.sitename.eu/$2 [R=301,L]  

хоть и стоит [L], но правила опять проходятся
 
поэтому лучше сначала описать какой нужен результат


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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:51 08-07-2008
Delphi6



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

Цитата:
поэтому лучше сначала описать какой нужен результат

Ничего особенного, всего у меня есть несколько вариантов как пользователь набрал url, вот все варианты (везде где есть слова bla-bla это означает что такого файла или директории не сушествует):
 
1) http://sitename.eu/subdomains/sub/exist-file.html  
2) http://sub.sitename.eu/exist-file.html  
4) http://sitename.eu/bla-bla/bla-bla.html  
4) http://sitename.eu/subdomains/sub/bla-bla.html  
5) http://sub.sitename.eu/bla-bla.html  
 
в первом случае пользователь или допустим гугл бот попытался обратиться к файлу напрямую через саб директории (допустим где-то случайно засветил), я его по этому редиректю на второй url, что мол первого реально не существует Если же пользователь набрал второй url то ясно все отображается как надо. В третьем случае так как urlа нет срабатывает ошибка 404 и идет редирект на http://sitename.eu/404error.htm это тоже работает. Но вот последние четвертый и пятый варианты должны тоже редиректить на http://sitename.eu/404error.htm так как они не существуют... но вместо этого они конвертяться то в одну форму то в другую... может есть возможность проверить RewriteCond-ом на наличие ошибок 403, 404, 500 и в случае если они есть то уже не делать конвератицю? (автоматом сработают  ErrorDocument)
 

Цитата:
хоть и стоит [L], но правила опять проходятся

наверно потому что срабатывает 404 Но каждый раз до него не доходит Пытался уже перенести в начало, но я не знаю как сделать что если сработал участок ErrorDocument тогда прекратить проверку... да и нельзя как я понимаю в начало переносить и потом тормозить, ведь в реале и второго урла нет и на него тоже 404 должен сработать

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 05:55 09-07-2008 | Исправлено: Delphi6, 06:07 09-07-2008
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Временно я удалил вот этот кусок:

Код:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.+)\ HTTP/
RewriteRule ^subdomains/([^/]+)/(.*)$ http://$1.sitename.eu/$2 [R=301,L]

вроде заработало, и все ошибки отлавливает, вот только не происходит конвертация:

Код:
http://sitename.eu/subdomains/sub/exist-file.html в
http://sub.sitename.eu/exist-file.html

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

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 14:50 10-07-2008
DJSERV

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Никак не пойму, подскажите:
есть урл  
http://test2.ru/news_read?52425.php
 надо отправить его по запросу  
index.php?catalog=content&link=52425
 
Пытаюсь  
 

Код:
RewriteRule news_read\?([0-9]+).php$ index.php?catalog=content&link=$1 [L]

Но получаю:
news_read was not found on this server.

Всего записей: 21 | Зарегистр. 25-04-2008 | Отправлено: 18:59 12-07-2008
Delphi6



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

Цитата:
news_read was not found on this server.

А вы уверены что у вас вообще включен и разрешен mod_rewrite? Может и глупый вопрос но, вы случаем не забыли про  RewriteEngine On? Если вы впервые с mod_rewrite-ом работаете то советую почитать цикл статей (4 коротенькие) указанных в шапке...

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 19:08 12-07-2008
DJSERV

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RewriteEngine включён.
Но файл index у меня находится в папке /temp. Чтобы отправить туда запрос ниже пишу  
 
RewriteCond %{REQUEST_FILENAME} !temp/.* [NC]
RewriteRule (.*) /temp/$1 [L]
 
Попробовал без знака ? - всё отлично. Но вот со знаком не работает.

Всего записей: 21 | Зарегистр. 25-04-2008 | Отправлено: 22:19 12-07-2008
Delphi6



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

Цитата:
Но файл index у меня находится в папке /temp.

Вот это уже частично проливает свет на проблему Если можно приведите весь кусок из .htaccess который отвечает за редирект, я посмотрю на практике что там происходит и если надо подправлю.

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 05:23 13-07-2008 | Исправлено: Delphi6, 05:24 13-07-2008
DJSERV

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

Код:
 
RewriteEngine On  
RewriteRule news_read\?([0-9]+).php$ index.php?catalog=content&link=$1 [L]  
 
RewriteRule read-([0-9]+)-?([0-9]+)? index.php?catalog=$1&link=$2 [L]
RewriteRule main-([0-9]+)? index.php?catalog=0&link=$1 [L]
 
RewriteCond %{REQUEST_FILENAME} !temp/.* [NC]  
RewriteRule (.*) /temp/$1 [L]
 
 

Все кроме первого работуют правильно. Я посмотрел лог- идёт ссылка на  test2.ru/www/temp/news_read которого нет. не обращая внимания на первое правило. Может там надо что либо ещё указать?

Всего записей: 21 | Зарегистр. 25-04-2008 | Отправлено: 10:43 13-07-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