Ru-Board.club
← Вернуться в раздел «Web-программирование»

» mod_rewrite: документация, готовые решения, вопросы

Автор: Terby
Дата сообщения: 27.02.2007 02:17
Apache 1.3.37
Автор: dacuan
Дата сообщения: 27.02.2007 14:37
Cheery
Terby
Дело в том, что если правила описывать правила mod_rewrite описываются в httpd.conf, то то обрабатываемый путь будет содержить ведущий слэш, а если его описывать в .htaccess, то ведущего слэша не будет, т.е. правило


Код: RewriteRule ^(.*)$ http://www.domain.ru$1
Автор: Cheery
Дата сообщения: 27.02.2007 16:01
dacuan

Цитата:
Дело в том, что если правила описывать правила mod_rewrite описываются в httpd.conf, то то обрабатываемый путь будет содержить ведущий слэш, а если его описывать в .htaccess, то ведущего слэша не будет, т.е. правил

ок.. не экспериментировал.. но все равно.. довольно странно у него ведет - должен всегда запрашивать сначала пароль. сдается мне, что его браузер как то неправильно интерпретирует заголовки.
Автор: Terby
Дата сообщения: 27.02.2007 18:22
дело не в браузере, у меня их три и все ведут себя одинаково

При запросе запаролленной дириктории без www вот, что пишется в тексте соединения:

WWW-Authenticate: Basic realm="Private zone"

После этой строчки апач сразу же пишет сие чудо:
Location: http://www.domain.ru/401.shtml

и это ненормально
Автор: kenny_sk8
Дата сообщения: 02.03.2007 09:47
Немного порылся в этом mod_rewrite и обнаружил следующее:

Код:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([^?]+)? index.php?link=$1 [NC,QSA,L]
Автор: Qwezar
Дата сообщения: 02.03.2007 14:38
kenny_sk8

смени link в index.php?link=$1 на другую переменную
Автор: ysnaky
Дата сообщения: 04.03.2007 08:57
Задача.
Нужно выполнить только одно из описанных правил:

RewriteRule ^/test1/$ /test2/ [L]
RewriteRule ^(.*)$ /test3/ [L]

при заходе по ссылке /test1/ ?

Как это добится? [L] говорит лишь о том, что за одну итерацию не нужно дальше применять правила. Но как только произойдет отработка первого правила, ссылка прогоняется вновь через все правила, и срабатывает второе.
Нужно при заходе на /test1/ сделать перенаправление на /test2/.
Все остальные запросы на /test3/.
А сейчас получается все перенаправляется на /test3/.
Можно ли как-то без усложнения регэкспов (без уточнения отсутсвия /test1/ во втором правиле), выполнить только одно из правил?
Автор: Passat19
Дата сообщения: 05.03.2007 00:51
Ребята... уже нет просто сил... дня 3 сижу уже, перерыт весь инет, и все напрасно.

Задача тривиальная!
из URL: hттp://xxx.msk.ru/index.php?p=page03
получить URL: hттp://xxx.msk.ru/page03.html

Пробовал все варианты:
------------------
RewriteEngine On
RewriteRule ^([^/]*)\.html$ /index.php?p=$1 [L]
------------------
RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteRule ^(.*)/(.*)$ $1index.php?p=$2
------------------
RewriteEngine on
RewriteBase /
Options +FollowSymlinks
RewriteRule ^data/([a-zA-Z0-9]+)\.html$ /index.php?p=$1
------------------
и многие другие - НЕ РАБОТАЕТ зараза!

Вроде не совсем чайник, сервак свой, стоит Server Version: Apache/1.3.37 (Unix) PHP/4.4.4, mod_rewrite включен, включаю отладку мода в httpd.conf - в лог mod_rewrite_log валятся строки типа:
81.222.220.85 - - [05/Mar/2007:01:08:59 +0300] [xxx.msk.ru/sid#8097184][rid#80f5034/initial] (1) [per-dir /home/xxx.msk.ru/public_html/] pass through /home/xxx.msk.ru/public_html/forum/index.php

т.е. модуль mod_rewrite работает однозначно, но вот как он работает... не понимаю...
.htaccess работает 100%, проверял.

похоже что все-таки что-то с настройкой мода, подскажите плиз где рыть...
причем похоже перестали работать и ранее работавшие строки:
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^hттp://(www.)?xxx.msk.ru(/)?.*$ [NC]
RewriteRule .*\.(pdf|rar|zip)$ hттp://xxx.msk.ru/error.php [R,NC]

Спасибо всем большое заранее!
Автор: Cheery
Дата сообщения: 05.03.2007 05:41
Passat19

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

cделай временно 9 уровень логирования и поймешь как он работает и что не так.
временно, иначе при большом количестве обращений съест место
Автор: kenny_sk8
Дата сообщения: 07.03.2007 21:02
Qwezar
Я бы хотел услышать ответ на попрос как поставить всё это в конец строки, а не то как обозвать переменную.
Автор: Cheery
Дата сообщения: 07.03.2007 21:08
kenny_sk8
в скрипте анализируешь $_SERVER['QUERY_STRING']
и вытаскиваешь нужные тебе значения
Автор: kenny_sk8
Дата сообщения: 09.03.2007 21:59
А в конец с помощью регвыра эту фигню поставить вообще никак? да?
Автор: Cheery
Дата сообщения: 09.03.2007 22:33
kenny_sk8

Цитата:
А в конец с помощью регвыра эту фигню поставить вообще никак? да?

вот именно, что добавляешь в конец.. или вообще просто сразу после ?
и потом скриптом смотришь, что ему передали
Автор: user472
Дата сообщения: 10.03.2007 14:45
Здравствуйте.
У меня такой вопрос:
Как заставить mod_rewrite применять правило для всех вхождений подстроки в строку а не только для одного.
Например:
RewriteRule ^(.*)test(.*)$ /$1TEST$2
Если запрос имеет вид lalalatestlalatest, то преобразование test в TEST выполнится всего один раз. В итоге получится строка lalalatestlalaTEST, вопрос, как сделать так, чтобы получилась lalalaTESTlalaTEST, без дублирования правила, т.к. вхождений искомой подстроки в строку может быть сколько угодно.
Спасибо.
И второй вопрос: где можно прочитать полное описание всех флагов mod_rewrite.
Автор: Cheery
Дата сообщения: 10.03.2007 19:34
user472

Цитата:
И второй вопрос: где можно прочитать полное описание всех флагов mod_rewrite.

а ссылки в шапке уже не устраивают?

Цитата:
В итоге получится строка lalalatestlalaTEST, вопрос, как сделать так, чтобы получилась lalalaTESTlalaTEST, без дублирования правила, т.к. вхождений искомой подстроки в строку может быть сколько угодно

к чему такой изврат?
пока ед на ум приходит.. сделать замену и послать снова на правила.. и так в цикле, пока не будет все заменено.
Автор: unnamednetua
Дата сообщения: 14.03.2007 13:01
Люди добрые помогите пожалуйста с написанием правил для такого замены адреса.

http://server/?go=dwnlds
http://server/download/

http://server/?go=dwnlds&gr=1
http://server/download/program/

http://server?go=dwnlds&gr=1&sgr=1
http://server/download/program/internet

http://server/?go=viewfile&id=142
http://server/viewfile/142

http://server/getfile.php?id=142
http://server/getfile/142

Спасибо.
Автор: DMx
Дата сообщения: 16.03.2007 20:32
Хочу, чтоб мой скрипт перехватывал управление только, если в ссылке НЕТ определенных слов: "_pre", "_mini" и "avatars". А так же, чтоб расширение файлов было только GIF, JPG или PNG.

Добился пока только для первых двух ("pre" и "mini"):


Код: <FilesMatch "[^mini|pre]\.(gif|jpg|png)$">
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ /files/my_script.php [L,QSA]
</FilesMatch>
Автор: Fader
Дата сообщения: 18.03.2007 12:41
Нужно решить следующую задачу:

При обращении к web-серверу из локальной сети (192.168.34.0/24): http://192.168.34.200/index.html (он же http://server/index.html) нужно чтобы апач редиректил на адрес http://192.168.34.200/site/index.html (он же http://server/site/index.html)

А при обращении с сервера к: http://127.0.0.1 (он же http://localhost) редирект не происходил.

Что написать в .htaccess ?
Автор: Sozon
Дата сообщения: 22.03.2007 21:14
Здравствуйте.

Помогите пожалуйста советом.

Хочу, чтобы адреса
http://site.ru/script/1 и http://site.ru/script/1/

заменялись на http://site.ru/script.php?p=1

Если использовать такую конструкцию

RewriteRule ^.*script/(.*)$ script.php?p=$1

то при использовании http://site.ru/script/1/ в скрипт передается 1/ вместо 1

А если юзать
RewriteRule ^.*script/(.*)/$ script.php?p=$1

то для http://site.ru/script/1 правило вообще не сработает.
Автор: Cheery
Дата сообщения: 22.03.2007 21:17

Цитата:
в скрипт передается 1/ вместо 1

и что? сложно выделить в нем?
RewriteRule ^.*script/(.*)/?$ script.php?p=$1
или
RewriteRule ^.*script/(.*)/+$ script.php?p=$1
не проверял какой сработает
Автор: Sozon
Дата сообщения: 23.03.2007 10:02
Спасибо.

Еще одна проблема.

Например мы заменяем

script.php?p1=2&p2=4

на

script/2/4.html

При этом на одном уровне со скриптом script.php лежит папка с картинками (pict). И пути к картинкам прописаны, как pict/p1.jpg

Если мы заменяем URL на script/2/4.html, то картинки уже не грузятся, т.к. получается, что мы находимся как бы в каталоге 2 и скорее всего картинки он пытается брать оттуда.

Если например заменять на script2-4.html, т.е. как бы не добавлять новые каталоги в URL, то все ok.

Можно ли как то решить эту проблему с директориями?

Автор: Cheery
Дата сообщения: 23.03.2007 15:43
Sozon

Цитата:
Можно ли как то решить эту проблему с директориями?

читать, к примеру, про таг base
либо писать пути от корня сайта
либо в том же rewrite проверять расширение файла
Автор: Mira
Дата сообщения: 13.04.2007 18:58
люди, перерыл много чего, не могу найти как работать с датами
нужно при получении урла, сравнить его стекущей датой...

буду благодарен за любую помошь

навеяно (http://forum.ru-board.com/topic.cgi?forum=31&topic=11023&start=20#20)
Автор: Cheery
Дата сообщения: 13.04.2007 19:02
Mira

Цитата:
нужно при получении урла, сравнить его стекущей датой...

сравнить что???
Автор: Mira
Дата сообщения: 13.04.2007 21:19
сравнить число, полученное из урла, с текущей датой... и в зависимости от решения сделать соответсвующие дейсвия.
Автор: Cheery
Дата сообщения: 13.04.2007 21:21
Mira

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

давай не словами, а примерами, а?? и дату можно по разному записать..

но проще перекидывать скрипту и в нем смотреть
Автор: Mira
Дата сообщения: 13.04.2007 22:22
http://forum.ru-board.com/topic.cgi?forum=31&topic=11023&start=20#20 здесь изложено почему не проще делать через скрипт.


например урл такого виде http://site.ru/070317/img123.gif

правило

RewriteRule ^([0-9]{6})/img([0-9]+).gif?$ /.....

вот надо сравнить это в htaccess и в соответсвии с резульатом заргузить либо

imgempty.gif
или на скрипт

getimg.php?id=$2


Все.

Спасибо.
Автор: Cheery
Дата сообщения: 13.04.2007 22:27
Mira
ну.. выцепляем дату из url и далее сравниваем с переменными окружения..
итого.. первый RewriteCond для вытаскивания даты
второй RewriteCond для сравнения ее с нынешней %{переменная}:
TIME_YEAR
TIME_MON
TIME_DAY
и далее RewriteRule для перехода по новой url
Автор: Mira
Дата сообщения: 14.04.2007 00:38
Cheery
Спасибо, а можно немножко подробней и с примерами.


Добавлено:
простите. не проштудировал вопрос а уже о несностях написал...
пока отбой.

Добавлено:

Цитата:

Есть много переменных названных TIME_xxx для условий редиректа. В связке со специальными лексикографическими образцами для сравнения <STRING, >STRING и =STRING мы можем производить редиректы зависящие от времени:

RewriteEngine on
RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700
RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900
RewriteRule ^foo\.html$ foo.day.html
RewriteRule ^foo\.html$ foo.night.html

Это выдает содержимое foo.day.html при запросе URL foo.html с 07:00 до 19:00 а в оставшееся время содержимое foo.night.html. Просто класная вещь для какой-либо странички…



может кому-то поможет
Автор: Sozon
Дата сообщения: 14.04.2007 12:21
Здравствуйте.
У меня вопрос по mod_rewrite

хочу чтобы
вместо http://мой_сайт/articles/ открывалось http://мой_сайт/articles.php

вместо http://мой_сайт/articles/2/ открывалось http://мой_сайт/articles.php?r=2

вместо http://мой_сайт/articles/2/3.htm открывалось http://мой_сайт/articles.php?r=2&s=3

Все это у меня получилось. Приведу код, может куму - нибудь поможет:
RewriteRule ^.*articles/([0-9]*)/([0-9]*)\.htm articles.php?s=$2&r=$1
RewriteRule ^.*articles/([0-9]*)/ articles.php?r=$1
RewriteRule ^.*articles articles.php

Но теперь мне надо, чтобы со старых страниц был 301-й редирект на новые, чтобы не терять PR, т.е. чтобы
http://мой_сайт/articles.php редиректилась на http://мой_сайт/articles/
http://мой_сайт/articles.php?r=2 на http://мой_сайт/articles/2/
http://мой_сайт/articles.php?r=2&s=3 на http://мой_сайт/articles/2/3.htm

Подтолкните к правильному решению плиз.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445

Предыдущая тема: PHP: Регулярные выражения (RegExp, Regular, eregi, preg)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.