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


Система IP-видеонаблюдения "Линия". Скачать бесплатную демо-версию для 16 камер. НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

Открыть новую тему     Написать ответ в эту тему

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
sanb



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Поставил Redmine и Subversion. Проблема в том что не могу подключиться к svn по http - access forbidden
Есть такие конфиги:

Цитата:
ServerAdmin  webmaster@localhost
SetEnv RAILS_ENV production
 
RewriteEngine On
 
# Rewrite index to check for static
RewriteRule ^/$ /index.html [QSA]
 
# Rewrite to check for Rails cached page
RewriteRule ^([^.]+)$ $1.html [QSA]
 
DocumentRoot /var/www/redmine/public/
 
<Directory /var/www/redmine/public/>
    Options +FollowSymLinks
    AllowOverride all
    Order allow,deny
    Allow from all
</Directory>
 

и

Цитата:
PerlModule Apache::DBI
PerlOptions +GlobalRequest
 
PerlLoadModule Apache::Redmine
<Location /svn>
  DAV svn
 
  SVNAllowBulkUpdates Prefer
 
  SVNParentPath "/svn/repos/svn"
  Order deny,allow
  Deny from all
  Satisfy any
  LimitXMLRequestBody 0
 
  SVNPathAuthz off
 
  PerlAccessHandler Apache::Authn::Redmine::access_handler
  PerlAuthenHandler Apache::Authn::Redmine::authen_handler
  AuthType Basic
  AuthName "Redmine SVN Repository"
  AuthUserFile /dev/null
 
  # read access
  <Limit GET PROPFIND OPTIONS REPORT>
     Require valid-user
     Allow from all
     Satisfy any
  </Limit>
  # write access
  <LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
  </LimitExcept>
 
  RedmineDSN "DBI:mysql:database=redmine_production;host=localhost"
 
  RedmineDbUser "redmine"
  RedmineDbPass "secretxxx"
</Location>
 

 
svn-репы располагаются в /svn/repos/svn/xxx

Всего записей: 2177 | Зарегистр. 26-07-2006 | Отправлено: 17:00 11-01-2017
xerpal



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тыщу лет не делал rewrite-ов в htaccess(да и плохо mod_rewrite всегда знал, эти чертовы регулярки)  - а тут снова понадобилось несколько стандартных штук
1. Задача убрать www - чтобы был постоянный 301 на домен без www. Решение с указанием имени домена есть  
  RewriteCond %{HTTP_HOST} ^www.mysite.ru$ [NC]
  RewriteRule ^(.*)$ http://mysite.ru/$1 [R=301,L]
 
домен mysite.ru
А как переписать это, чтобы для текущего домена работало, на котором находится htacces   - а то на тестовом работает. а потом переносить ещё два раза надо....
 
2. Как адреса с верхним регистром отредиректить в нижний регистр?  Притом не касаясь символов после вопроса ? .  
 
3. Как убрать замыкающую точку аля mysite.ru./?    
 
Заранее спасибо
 

Всего записей: 894 | Зарегистр. 08-10-2011 | Отправлено: 15:34 27-08-2017 | Исправлено: xerpal, 15:45 27-08-2017
Mavrikii

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

Цитата:
на котором находится htacces  


Код:
RewriteCond %{HTTP_HOST} ^www\.(.*)\.ru$ [NC]  
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]  

 

Цитата:
Как адреса с верхним регистром отредиректить в нижний регистр?

нежелательно такое делать, будет куча разных URL с одним контентом.

Код:
RewriteMap lc int:tolower
RewriteRule ^/(.*)$ /${lc:$1}  

 

Цитата:
Как убрать замыкающую точку аля mysite.ru./?  


Код:
RewriteCond %{HTTP_HOST} ^(.+?)\.$
RewriteRule ^ http://%1%{REQUEST_URI} [L,R=302,NE]

Всего записей: 4911 | Зарегистр. 20-09-2014 | Отправлено: 19:59 27-08-2017
xerpal



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

Цитата:
RewriteCond %{HTTP_HOST} ^www\.(.*)\.ru$ [NC]
   RewriteRule ^(.*)$ http://%1/$1 [R=301,L]  

Спасибо. Только вроде .ru тут лишнее - убрал, вроде работает.

Цитата:
RewriteCond %{HTTP_HOST} ^(.+?)\.$  
 RewriteRule ^ http://%1%{REQUEST_URI} [L,R=301,NE]

Спасибо, работает.  

Цитата:
нежелательно такое делать, будет куча разных URL с одним контентом.

Наоборот же, поисковики будут только нижний регистр хавать, редирект 301-й для этого и делается.

Цитата:
RewriteMap lc int:tolower  
 RewriteRule ^/(.*)$ /${lc:$1}  

Такое не работает. вызывает ошибку. Может не в том месте, может не рядом с остальными правилами? Причем выдает ошибку независимо от наличия верхнего регистра

Всего записей: 894 | Зарегистр. 08-10-2011 | Отправлено: 21:18 27-08-2017 | Исправлено: xerpal, 21:21 27-08-2017
Mavrikii

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

Цитата:
Такое не работает. вызывает ошибку

Апач какой? в доках к 2.5 записано так

Код:
RewriteMap lc int:tolower
RewriteRule "(.*)" "${lc:$1}" [R]

ну и какую ошибку то пишет?

Всего записей: 4911 | Зарегистр. 20-09-2014 | Отправлено: 21:25 27-08-2017
xerpal



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

Цитата:
Апач какой? в доках к 2.5 записано так

Тут разобрался вроде. пишут, что  

Цитата:
RewriteMap lc int:tolower
нужно прописывать в conf файлах.  
Прописал, ошибка пропала, но не работает
 
 
PS разобрался, нашел тут http://linux-notes.org/rewrite-pravila-dlya-zameny-propisny-h-bukv-v-strochny-e/ решение,  

Цитата:
RewriteRule ^(.*?[A-Z]+.*)$ /${lc:$1} [L,NE,R=301]

 
Спасибо за наводку.

Всего записей: 894 | Зарегистр. 08-10-2011 | Отправлено: 21:34 27-08-2017 | Исправлено: xerpal, 21:37 27-08-2017
Mavrikii

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xerpal
какой апач, какая ос?
[R] сделали?

Всего записей: 4911 | Зарегистр. 20-09-2014 | Отправлено: 21:38 27-08-2017
xerpal



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

Цитата:
какой апач, какая ос?

Все заработало.     Apache 2.0
Цитата:
 
[R] сделали?

В смысле? Я вставил код выше.

Всего записей: 894 | Зарегистр. 08-10-2011 | Отправлено: 23:03 27-08-2017
xerpal



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

Цитата:
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} ^(.+)/?$
  RewriteRule ^(.+)/$ http://mysite.ru/$1 [R=301,L]
 
Как бы ещё сделать правило независимым от домена?  
 
Но тут проблема - не работает с корневой страницей ( то есть mysite.ru////// не переводит в mysite.ru). В чем тут ошибка, как лечить?  
Это решил, совсем другим правилом....
 

Всего записей: 894 | Зарегистр. 08-10-2011 | Отправлено: 10:12 28-08-2017 | Исправлено: xerpal, 11:21 28-08-2017
xerpal



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

Цитата:
RewriteMap lc int:tolower    
RewriteRule ^/(.*)$ /${lc:$1}  

 
Чтобы это работало нужно первую директиву в conf файл добавлять, а это запрещено.  
 
Вот вроде это ПОЧти работает - но глючит, может кто починит?  

Цитата:
RewriteBase /
 
# If there are caps, set HASCAPS to true and skip next rule
RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]
 
# Skip this entire section if no uppercase letters in requested URL
RewriteRule ![A-Z] - [S=28]
 
# Replace single occurance of CAP with cap, then process next Rule.
RewriteRule ^([^A]*)A(.*)$ $1a$2
RewriteRule ^([^B]*)B(.*)$ $1b$2
RewriteRule ^([^C]*)C(.*)$ $1c$2
RewriteRule ^([^D]*)D(.*)$ $1d$2
RewriteRule ^([^E]*)E(.*)$ $1e$2
RewriteRule ^([^F]*)F(.*)$ $1f$2
RewriteRule ^([^G]*)G(.*)$ $1g$2
RewriteRule ^([^H]*)H(.*)$ $1h$2
RewriteRule ^([^I]*)I(.*)$ $1i$2
RewriteRule ^([^J]*)J(.*)$ $1j$2
RewriteRule ^([^K]*)K(.*)$ $1k$2
RewriteRule ^([^L]*)L(.*)$ $1l$2
RewriteRule ^([^M]*)M(.*)$ $1m$2
RewriteRule ^([^N]*)N(.*)$ $1n$2
RewriteRule ^([^O]*)O(.*)$ $1o$2
RewriteRule ^([^P]*)P(.*)$ $1p$2
RewriteRule ^([^Q]*)Q(.*)$ $1q$2
RewriteRule ^([^R]*)R(.*)$ $1r$2
RewriteRule ^([^S]*)S(.*)$ $1s$2
RewriteRule ^([^T]*)T(.*)$ $1t$2
RewriteRule ^([^U]*)U(.*)$ $1u$2
RewriteRule ^([^V]*)V(.*)$ $1v$2
RewriteRule ^([^W]*)W(.*)$ $1w$2
RewriteRule ^([^X]*)X(.*)$ $1x$2
RewriteRule ^([^Y]*)Y(.*)$ $1y$2
RewriteRule ^([^Z]*)Z(.*)$ $1z$2
 
# If there are any uppercase letters, restart at very first RewriteRule in file.
RewriteRule [A-Z] - [N]
 
RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L]
 
 
mysite.ru/NODE/2112 - переводит в неверные mysite.ru/node/2112/2112/2112/2112/2112 - лишние 4 раза, по количеству букв верхнего регистра

Всего записей: 894 | Зарегистр. 08-10-2011 | Отправлено: 19:13 28-08-2017 | Исправлено: xerpal, 10:01 29-08-2017
Mavrikii

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

Цитата:
Чтобы это работало нужно первую директиву в conf файл добавлять, а это запрещено.

вы все одним скриптом обрабатываете? ну так перекидывайте в нем.
 

Цитата:
Вот вроде это ПОЧти работает - но глючит, может кто починит?  

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

Цитата:
RewriteRule ^/?(.*) /$1 [R=301,L]

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

Цитата:
mysite.ru/NODE/2112 - переводит в неверные mysite.ru/node/2112/2112

уверены, что причина тут, а не в другом правиле?

Всего записей: 4911 | Зарегистр. 20-09-2014 | Отправлено: 19:37 28-08-2017
xerpal



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

Цитата:
уверены, что причина тут, а не в другом правиле?

Нет, в данном случае уверенность у меня тут нулевая.  

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

Ну так он запомнит тестовый домен, пусть вечно его помнит.  

Цитата:
думаю, что с точки зрения производительности это не очень хорошо.  

сам сайт на тяжелой CMS  - это миллисекунда лишняя ерунда

Всего записей: 894 | Зарегистр. 08-10-2011 | Отправлено: 22:04 28-08-2017
Mavrikii

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

Цитата:
Нет, в данном случае уверенность у меня тут нулевая.  

ну так сдается мне, что преобразовывает, а далее перепрыгивает на следующие

Цитата:
RewriteRule ![A-Z] - [S=28]  


Всего записей: 4911 | Зарегистр. 20-09-2014 | Отправлено: 22:07 28-08-2017
xerpal



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RewriteCond %{HTTP_HOST} ^(.+?)\.$  
 RewriteRule ^ http://%1%{REQUEST_URI} [L,R=302,NE]
 
И точку перестало удалять. (((((
Причем удаляет на локальном домене, где точек нет, а вот на обычном blablabla.ru - не удаляет ((
 
Добавлено:
Mavrikii

Цитата:
ну так сдается мне, что преобразовывает, а далее перепрыгивает на следующие

Да это-то я заметил, что, сколько заглавных букв - столько повторов. Как бы от этого избавиться?

Всего записей: 894 | Зарегистр. 08-10-2011 | Отправлено: 22:15 28-08-2017 | Исправлено: xerpal, 22:19 28-08-2017
Mavrikii

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

Цитата:
И точку перестало удалять.

все зависит от того, где и в каком порядке записаны правила.
 

Цитата:
Да это-то я заметил, что, сколько заглавных букв - столько повторов

повторов чего? подробнее описывайте. здесь было 4 заглавных, а повтор 1
Цитата:
mysite.ru/NODE/2112 - переводит в неверные mysite.ru/node/2112/2112


Всего записей: 4911 | Зарегистр. 20-09-2014 | Отправлено: 22:18 28-08-2017
xerpal



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

Цитата:
все зависит от того, где и в каком порядке записаны правила.

Я все остальные правила удалил, только для точки оставил - и не работает. ((( Работает только для доменов без точек - для локальных условных mysite/
 

Цитата:
повторов чего? подробнее описывайте. здесь было 4 заглавных, а повтор 1

mysite.ru/ABCDefg/55 - заглавных 4, значит ссылка будет mysite.ru/abcdefg/55/55/55/55 - 4 повтора

Всего записей: 894 | Зарегистр. 08-10-2011 | Отправлено: 22:24 28-08-2017 | Исправлено: xerpal, 22:29 28-08-2017
Mavrikii

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

Цитата:
mysite.ru/ABCDefg/55 - заглавных 4, значит ссылка будет mysite.ru/abcdefg/55/55/55/55 - 4 повтора

флаг [DPI] добавьте к каждому правилу с переделкой букв.
потому, что все, что находится глубже данной диры (раз реального пути нет) является PATH_INFO и цепляется каждый раз заново
 

Цитата:
Я все остальные правила удалил, только для точки оставил - и не работает

видимо потому, что сервер правильно определяет имя хоста (без точки) - если посмотрите переменные окружения, то увидите это (простой вывод phpinfo())
у меня, правда, стоит фронтэнд, может он "переделывает", пока нет возможности протестировать без него
 
https://stackoverflow.com/questions/31972945/how-to-remove-the-trailing-dot-after-tld-by-using-mod-rewrite
https://webmasters.stackexchange.com/questions/102221/redirect-url-with-multiple-trailing-dots-and-trailing-slashes-using-htaccess
 
ps: да, фронт переделывал. сделал запрос напрямую с самого сервера - вырезает точку

Всего записей: 4911 | Зарегистр. 20-09-2014 | Отправлено: 23:53 28-08-2017 | Исправлено: Mavrikii, 00:07 29-08-2017
xerpal



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

Цитата:
видимо потому, что сервер правильно определяет имя хоста (без точки) - если посмотрите переменные окружения, то увидите это  

А может прописать конкретый хост - тогда работать будет?  У меня локально работает, вывожу на базовый хост - там отказывается.  
 
PS удалил все директивы локально - точку продолжает убирать. Это какой то апачевский кеш такой какой-то? И как его очистить?  
 

Всего записей: 894 | Зарегистр. 08-10-2011 | Отправлено: 07:54 29-08-2017 | Исправлено: xerpal, 08:03 29-08-2017
Mavrikii

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

Цитата:
 У меня локально работает, вывожу на базовый хост - там отказывается

возможно там тоже есть фронэнд (nginx, к примеру), который сам обрезает. смотрите какой HTTP_HOST получает ваш скрипт (просто тестовый с phpinfo(), к примеру).
 

Цитата:
удалили все директивы локально - точку продолжает убирать.

если была 301 переадресация - запомнил браузер, чистить его кэш.

Всего записей: 4911 | Зарегистр. 20-09-2014 | Отправлено: 07:57 29-08-2017 | Исправлено: Mavrikii, 07:57 29-08-2017
xerpal



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

Цитата:
смотрите какой HTTP_HOST получает ваш скрипт

Правильный получает, без точки в конце.  
 

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

Да, частично помогает. Но на сервере нет.  
 

Цитата:
возможно там тоже есть фронэнд (nginx, к примеру)

По-любому есть. Тогда что надо, его перезапустить или как?  
 
Проверено - что на сервере правила точно запоминаются, я в htaccess отключил правило по удалению www - все равно работает, так что где-то запомнено.
 
Вопрос в том, как этот "кеш" удалить...

Всего записей: 894 | Зарегистр. 08-10-2011 | Отправлено: 08:30 29-08-2017 | Исправлено: xerpal, 08:32 29-08-2017
Открыть новую тему     Написать ответ в эту тему

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

Компьютерный форум Ru.Board » Интернет » Web-программирование » mod_rewrite: документация, готовые решения, вопросы

Имя:
Пароль:
Сообщение

Для вставки имени, кликните на нем.

Опции сообщенияДобавить свою подпись
Подписаться на получение ответов по e-mail
Добавить тему в личные закладки
Разрешить смайлики?
Запретить коды


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2017

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru