|
Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » mod_rewrite etc. |
|
mod_rewrite etc.
|
Ветеран Сообщения: 1864 |
Профиль | Отправить PM | Цитировать Вот только недавно познакомился с этим замечательным модулем
Вот что я вынес из данного знакомства-с помощью mod_rewrite можно: 1) Самое распространённое использование-перезапись урлов, например есть урл index.php?forum=webmaster&topic=45 можно переписать в index.php/webmaster/45, что для некоторых поисковых машин намного более лучший вариант 2)запретить доступ к определённому файлу RewriteRule ^file.ext$ - [F] 3)запретить доступ определённому браузеру, сборщику почты, доступ с определённого айпи или пришедшим с определённого сайта RewriteCond %{HTTP_USER_AGENT} ^Browser_Name [OR] RewriteCond % {REMOTE_HOST} ^www.badsite.com$ [OR] RewriteCond % {REMOTE_ADDR} ^169.45.23.01$ RewriteRule ^.*$ - [F] Это было самое распространённое применение данного модуля, но есть ещё много всяких интересных хитростей: наприсер я недавно нашёл такое применение-при вызове страницы pic.html, нужно показывать картинку дня, поэтому можно переписать этот урл в pic-06-06.html c помощью серверных переменных TIME_MON и TIME_DAY RewriteRule ^pic.html$ pic-%{TIME_MON}-%{TIME_DAY}.html Или ещё кому нравится можно переписать файл index.php кому очень захочется в index.bmp Если кто ещё знает интересные применения данного модуля, то постите тут |
|
------- Отправлено: 14:41, 06-06-2004 |
just mar Сообщения: 3904
|
Профиль | Отправить PM | Цитировать русский первод доков
еще и т.д. см. * на opennet А *вот проблемы и достижения в форумах *(все по тому же сайту) а если реально кто чего еще интересного делает, то я тоже с удовольствием послушаю [s]Исправлено: mar, 0:11 9-06-2004[/s] |
Отправлено: 14:20, 07-06-2004 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Engrossed by the Void Сообщения: 2229
|
Профиль | Отправить PM | Цитировать mar, к тебе тоже нижайшая просьба оформлять ссылки тегами форума. Пусть и не длинные ссылки, но смотрятся как-то... хм... не эстетично . Не говорю уж о длинющих.
|
------- Отправлено: 01:30, 08-06-2004 | #3 |
just mar Сообщения: 3904
|
Профиль | Отправить PM | Цитировать Prisoner извинямс
|
Отправлено: 00:12, 09-06-2004 | #4 |
Ветеран Сообщения: 1864
|
Профиль | Отправить PM | Цитировать Prisoner-это по настоящему всё от лени можно же просто взять и скопировать из адресной строки браузра Но мы будем исправлятся
mar У меня тут возникла такая проблема: надо переписывать адреса такого типа www.site.com/lalala в www.site.com/file.php?var=lalala - это без проблем получается, но у меня в этой же директории есть ещё папки, которые должны вызыватся как обычные папки и адрес на них не должен переписыватся Я думал, так может пройти: RewriteCond %{REQUEST_URI} !-d но почему то не проходит приходится каждую папку по отдельности перечислять: RewriteCond %{REQUEST_URI} !papka_name А если создам новою важную папку и забуду RewriteCond дописать, то ничего хорошего из этого не выйдет, нужен какой то общий вариант, чтобы все папки отсекал |
|
------- Отправлено: 02:38, 09-06-2004 | #5 |
just mar Сообщения: 3904
|
Профиль | Отправить PM | Цитировать vadimiron
не знаю, я ведь им не пользуюсь, хотя знаю, что есть очень большие любители Мне не нравятся длинные ссылки в скриптах (и с ними не всегда можно защет POST cладить.) Но аналогично длинная система каталогов мне нравится, пожалуй, еще меньше На сайты же ходят не только поисковики, но и люди А что касается твоего вопроса - там, намколько мне помнится можно: - поиграть regexp-ами - подставить обрабатывающий скрипт (ну, он может, например, проверять реальное дерево каталогов и запрещать его переписывать) Но это все общие соображения. Своего опыта работы с модулем у меня нет. |
Отправлено: 12:19, 09-06-2004 | #6 |
Ветеран Сообщения: 1864
|
Профиль | Отправить PM | Цитировать Делать мне было нечего и решил я по данной теме маленькую статью накатать
Надеюсь кому нибудь поможет. Ссылки на официальный мануал (перевод на русский): Мануал Ну сначало, проверьте, установлен ли этот модуль у вас. Внимание: это спец модуль к апачу, с другими серверами он *не работает. Все команды данного модуля пишуться в файл .htaccess, причём если уже что то в данном файле стоит, то можно смело писать со следущей строки. Команды модуля состоят из определённых директив, вот они : RewriteEngine RewriteBase RewriteCond RewriteLock RewriteLog RewriteLogLevel RewriteMap RewriteOptions RewriteRule Скажу честно, что не всеми директивами я пока владею, но всё основное сейчас опишу. Начинается вся красота с включения модуля Эта первая строчка, которая должна присутствовать, чтобы модуль заработал, причём если далее следует много различных директив, достаточно поставить RewriteEngine off, чтобы деактивировать действие всех команд, не надо при этом комментировать все строчки. Вторая обязательная строчка, без которой механизм преобразований работать не будет: Если ваш системный администратор запрещает Вам использование «Options +FollowSymlinks», Вы не сможете ограничить использование mod_rewrite для отдельных каталогов, вместо этого изменения будут действовать на весь сервер. Следущей обязательной командой нужно определить базовый URL (область) работы модуля, этим занимается директива RewriteBase: "/" эквивалентно http://yoursite.com, но можно конечно и другой базовый URL указывать(например, когда URL'ы НЕ прямо соответствуют физическим путям, но об этом подробнее в официальном мануале) Следущая интересная директива это RewriteLog, как ни сложно догадаться, она служит для определения файла ведения логов работы модуля. Пример из мануала: Раз уж говорим про ведение журнала, то ещё одна директива по этому поводу: RewriteLogLevel а, причём а равно от 0 до 9, где 0=журнализация не ведётся, 9=записываються почти все действия модуля. Ну а теперь самое интересное: директива RewriteRule-она как раз занимается обработкой и перезаписью урлов (и не только этим). На каждое правило пишется свой RewriteRule. Также очень важен порядок, надо следить, чтобы второй RewriteRule не испортил работу первого RewriteRule, то есть чтобы они не пересекались. В общем виде выглядит это так: Шаблон-это "нормальный урл", который мы ищем для обработки. Шаблон основан на ПЕРЛ-совместимых регулярных выражениях. Действием же может быть "новый урл", то есть тот урл, который мы хотим получить в результате обработки, или какой нибудь флаг (будут ниже рассмотрены). Также следует отметить, что в RewriteRule и RewriteCond(следует ниже) можно использовать переменные сервера (%{VARNAME}) (их полный список в официальном мануале). Ну теперь перейдём к простому примеру: ^ якорь начала строки $ якорь конца строки file.ext какой то любой файл [F] флаг, обозначающий запрещение. То есть вся строка обозначает, что при вызове данного файла будет выдана ошибка номер 403. Следущий пример: перед нами стоит задача-вместо такого урла topic.cgi?forum=20&topic=1089, получать такой topic.cgi/20/1089 Сначало замечу: то, что в шаблоне пишеться в скобках, используется потом в качестве переменных в действии (в порядке возникновения скобок получаем $1, $2, $3 ....). Теперь как действует предыдущий пример: есть например такой запрос topic.cgi/20/1089, данная строка сверяется с шаблоном и если строка совпадает с шаблоном, что и происходит в нашем случае, урл трансформируется в topic.cgi?forum=20&topic=1089 и далее идёт вызов именно этого урла. 20 в нашем случае = $1 ( то есть(\d{,2}) ), а 1089-$2 ( то есть(\d{,5}) ). Ещё один пример: мы перенесли папку soccer из корня сайта в папку sport, и не хотим переписывать все ссылки (ну и ссылки в избранном юзеров мы не сможем поменять) (.*) равно $1 и обозначает любые знаки в любом количестве, так как вряд ли вызывается просто папка, наверняка какой нибудь файл из даной папки со своими переменными и тд. Следует отметить, что RewriteRule не так часто употребляется в одиночестве, чаще его действие ограничивается условием, когда может выполняться данный RewriteRule. Условие выполнено в виде отдельной директивы RewriteCond. Главное здесь, что условие должно быть прописано перед правилом. На одно правило может приходится несколько условий (все эти условия должны быть выполнеными, чтобы перейти к выполнению правила, но также условия можно связать словом "или"-для этого в конце каждого условия, кроме последнего, ставится флаг [OR]). В общем виде условие выглядит так: RewriteCond СравниваемаяСтрока Условие СравниваемаяСтрока в 99% выражается серверной переменной (но также может быть простым текстом с использованием например переменной($1, $2, $3...), созданной в правиле, к которому относится данное условие), условие же это шаблон, то есть регулярное выражение с некоторыми дополнениями. Данные дополнения выписываю просто из мануала: '<Условие' (лексически меньше) Условие считается простой строкой и *лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически меньше чем Условие. '>Условие' (лексически больше) Условие считается простой строкой и *лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически больше чем Условие. '=Условие' (лексически равно) Условие считается простой строкой и лексически сравнивается с СравниваемаяСтрока. Истинно если СравниваемаяСтрока лексически равно Условие, т.е. эти две строки полностью одинаковы (символ в символ). Если Условие имеет вид "" (два знака дюйма идущих подряд) это сравнивает СравниваемаяСтрока с пустой строкой. '-d' (является ли каталогом) СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является каталогом. '-f' (является ли обычным файлом) СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является обычным файлом. '-s' (является ли обычным файлом с ненулевым размером) СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является обычным файлом, размер которого больше нуля. '-l' (является ли символической ссылкой) СравниваемаяСтрока считается путем, проверяется существование этого пути и то что этот путь является символической ссылкой. '-F' (проверка существования файла через подзапрос) Проверяет через все списки контроля доступа сервера, существующие в настоящий момент, является ли СравниваемаяСтрока существующим файлом, доступным по этому пути. Для этой проверки используется внутренний подзапрос, поэтому используйте эту опцию с осторожностью *— это отрицательно сказывается на производительности сервера! '-U' (проверка существования URL через подзапрос) Проверяет через все списки контроля доступа сервера, существующие в настоящий момент, является ли СравниваемаяСтрока существующим URL, доступным по этому пути. Для этой проверки используется внутренний подзапрос, поэтому используйте эту опцию с осторожностью *— это отрицательно сказывается на производительности сервера! Пример Если REMOTE_ADDR равен 212.37.64.23, то ставим запрет на любой запрос, исходящий с данного айпи Всех, пришедших по ссылкам, расположенным на сайте www.somesite.com, перенаправляем на страницу page.html RewriteCond %{REQUEST_URI} !uri1 RewriteCond %{REQUEST_URI} !uri2 RewriteCond %{REQUEST_URI} !uri1 RewriteRule ^([a-zA-Z0-9_-]{3,40})$ user.php?user=$1 Вроде, если в кратце рассказывать-это всё. Ещё пару интересных примеров, которые я нашёл на различных сайтах: Пример 1 Цель – показать посетителям «фото дня». Посетитель, кликнувший по ссылке http://yoursite.com/pic.html увидит лучшую фотографию или картинку дня, и так каждый день. Мы будем работать с серверными переменными: TIME_MON TIME_DAY Поместим в файл .htaccess одну единственную строку: RewriteRule ^pic.html$ pic-%{TIME_MON}-%{TIME_DAY}.html Запрашиваемый URL будет перезаписан, например: pic-08-28.html pic-08-29.html pic-08-30.html и так далее. Теперь, все что вы должны сделать – это единожды загрузить файлы с соответсвующими именами и забыть о ежедневном обновлении ссылки. Переменные времени также могут использоваться для другой периодичности. Проблема отсутствующего завершающего слэша Описание: Каждый вебмастер может спеть песню о проблеме отсутствующих завершающих слэшей при использовании URL ссылающихся на каталоги. Если они отсутствуют, сервер выдает ошибку, потому что если вы пишете /~quux/foo вместо /~quux/foo/ сервер ищет файл foo. И поскольку этот файл является каталогом, происходит ошибка. В действительности, в большинстве случаев это исправляется само, однако, в некоторых случаях, нужно самим эмулировать этот механизм. Например, после того, как вы сделали массу сложных редиректов URL на CGI скрипты и т.д. Решение: Решение этой тонкой проблемы — это позволить серверу добавлять завершающий слэш автоматически. Чтобы сделать это правильно, мы должны использовать внешний редирект, для того чтобы браузер правильно запрашивал картинки и пр. В случае если бы мы *сделали только внутренний редирект, это бы работало только для самой страницы каталога (страницы по-умолчанию), однако были бы проблемы при наличии любых картинок на этой странице с относительными URL, потому что браузер сделал бы запрос на вставку in-lined объекта. Например, запрос для image.gif на странице /~quux/foo/index.html без внешнего редиректа выглядел бы как /~quux/image.gif! Поэтому, для того чтобы сделать это трюк, мы пишем: RewriteEngine *on RewriteBase * */~quux/ RewriteRule * *^foo$ *foo/ *[R] Сумашедший и ленивый может даже сделать следущее в *файле .htaccess находящемся в корне веб-пространства своего сайта. Однако, следует отметить, что это создает некоторые накладные расходы. RewriteEngine *on RewriteBase * */~quux/ RewriteCond * *%{REQUEST_FILENAME} *-d RewriteRule * *^(.+[^/])$ * * * * * $1/ *[R] Поиск страниц больше чем в одном каталоге Описание: Иногда необходимо позволить веб-серверу искать страницы больше чем в одном каталоге. Здесь вам не помогут ни MultiViews ни *другие техники. Решение: Мы пишем явный набор правил который ищет файлы в каталогах. RewriteEngine on # * во-первых попытаемся найти это в указанном месте/... # * ...и если нашли то заканчиваем поиск и сидим и радуемся: RewriteCond * * * * /your/docroot/dir1/%{REQUEST_FILENAME} *-f RewriteRule *^(.+) */your/docroot/dir1/$1 *[L] # * во-вторых - попытаемся найти это в pub/... # * ...и если нашли то заканчиваем поиск и сидим и радуемся: RewriteCond * * * * /your/docroot/dir2/%{REQUEST_FILENAME} *-f RewriteRule *^(.+) */your/docroot/dir2/$1 *[L] # * иначе продолжаем для других директив Alias или ScriptAlias, # * и т.д. RewriteRule * ^(.+) *- *[PT] И наполедок ещё две директивы: RewriteMap и относящиеся к ней RewriteLock. Директива RewriteMap-ассоциативный массив преобразований, который может быть использован в правилах преобразований и использующий соответствующие функции для вставки/извлечения элементов, для поиска по ключу соответствующих значений. Источник этого поиска может иметь различный тип. Но я этим не умею пользоваться, подробности смотрим в мануале. [s]Исправлено: Prisoner, 3:43 29-08-2004[/s] |
------- Отправлено: 00:34, 17-08-2004 | #7 |
just mar Сообщения: 3904
|
Профиль | Отправить PM | Цитировать а мне тут приспичило закрывать доступ скрипткидесам (ну достали, прямо скажем)
вот вариант - когда закрывается доступ списку ip и машин: Цитата:
Добавлено: хм, печально, но факт - для броузеров вышеперечисленные мной запреты честно генерят отлупы, а вот от такой штуки не спасают: telnet ххх.ххх.ххх.ххх 80 Trying ххх.ххх.ххх.ххх... Connected to ххх.ххх.ххх.ххх. Escape character is '^]'. то есть пустили по http порту и ничем наш модуль не помог |
|
Отправлено: 23:27, 19-10-2004 | #8 |
CodeMaker
Сообщения: n/a |
Вот блуждал по инертену и наткнулся вот на что, на сайте
http://www.apache.tut.ru/ кликая по ссылке в которой прописано http://far.h1.ru/serv/apache/#c2 попадаешь опять на этот адрес http://www.apache.tut.ru/ как это реализовано? По какой ссылке нажмешь в стусно строке остается все тожа и страницу грузится по другим ссылкам. Вобмщем вопрос такой ) как сделать чтобы в статусной сроке было прописано к примеру http://www.apache.tut.ru/ но загружались страницы http://far.h1.ru/serv/apache/#c2 http://far.h1.ru/serv/apache/#c3 http://far.h1.ru/serv/apache/#c3 в зависимости от того по какой из сылок перейти |
Отправлено: 08:40, 16-02-2005 | #9 |
Engrossed by the Void Сообщения: 2229
|
Профиль | Отправить PM | Цитировать Не совсем понятный вопрос, если честно. В описании имеет место быть банальный редирект. Поглядите окументацию и примеры приведенные выше. Это вам необходимо.
|
------- Отправлено: 10:20, 17-02-2005 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Прочее - mod_rewrite .htaccess | Wimpheling | Общий по Linux | 0 | 08-10-2013 14:57 | |
Разное - Включение модуля mod_rewrite | Lenivets1 | Программирование и базы данных | 5 | 13-02-2012 20:00 | |
mod_rewrite | Jaels | Программное обеспечение Linux и FreeBSD | 2 | 06-01-2012 12:09 | |
mod_rewrite | kishert | Вебмастеру | 3 | 10-03-2009 06:52 | |
mod_rewrite | PHANTOM777 | Вебмастеру | 1 | 20-07-2008 10:00 |
|