Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Apache

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ваш читатель просит помощи. Apache. mod_rewrite
 
 автор: LINKIN   (02.02.2010 в 15:56)   письмо автору
 
 

Не думал что. такое случится, но я забыл многое в mod_rewrite. Помогите вспомнить основы.
Регулярные выражения я разберу, есть откуда почитать. Суть в другом, в самом принципе работы.

Например, когда мы преобразовываем ссылку
www.yoursite.com/script.php?product=123
к виду
www.yoursite.com/cat/product/123/

мы используем выражение
RewriteRule cat/(.*)/(.*)/$ /script.php?$1=$2


Правильно ли понимаю, что изначально мы смотрим и пишем /script.php?$1=$2, то есть вторую часть, изначальную свою ссылку. Затем мы прописываем первую часть cat/(.*)/(.*)/$ и каждая переменная (в нашем случае $1, $2) (последовательно, слева направо?) идет прописываться в каждую круглую скобку? Вот, и какую роль тогда здесь играют регулярные выражения?

  Ответить  
 
 автор: Trianon   (02.02.2010 в 16:01)   письмо автору
 
   для: LINKIN   (02.02.2010 в 15:56)
 

принцип работы рерайта куда проще понять, если изучить регулярки сперва . А не потом.
фактически рерайт это что-то вроде ereg_replace, встроенный в апач на нижнем уровне перед обработкой запроса.

  Ответить  
 
 автор: LINKIN   (02.02.2010 в 22:46)   письмо автору
 
   для: Trianon   (02.02.2010 в 16:01)
 

Ок. Прочитал регулярные выражения. Разобрался. Но суть вопрос эта не изменило. Как строки обменивается переменными?

  Ответить  
 
 автор: heed   (02.02.2010 в 23:41)   письмо автору
 
   для: LINKIN   (02.02.2010 в 22:46)
 

>/script.php?$1=$2, то есть вторую часть, изначальную свою ссылку. Затем мы прописываем первую часть cat/(.*)/(.*)/$

там как в [pe]reg_replace() , первый параметр выражение, которое сопоставляется с REQUEST_URI ( , не включая "?" и QUERY_STRING)
, а второй то REQUEST_URI которое в результате будет запрошено внутренним подзапросом сервера
(, только это слегка отличается от внутренних подзапросов как в случае с подзапросов shtml файлами с mod_include)

И есть возможность подставлять скроме подсовпадений $0..$N шаблона RewriteRule
ещё подсовпадения шаблонов предшествующих RewriteCond ( %0..%N )
, где немного другой принцип , первый параметр проверяемое значение, а второй параметр шаблон
,например RewriteCond %{QUERY_STRING} ^id=([0-9]+)&parent=([0-9]+)
, но такое делать бывает бессмысленно так-как чаще один файл обрабатывает много запросов, а не много запросов с разными параметрами обрабатываются многими файлами

// пару ссылок было здесь
http://softtime.ru/forum/read.php?id_forum=5&id_theme=67696

  Ответить  
 
 автор: Trianon   (03.02.2010 в 00:56)   письмо автору
 
   для: LINKIN   (02.02.2010 в 22:46)
 

никак не обмениваются.
На этапе рерайта нет никаких переменных.
Просто выполняется замена сопоставленной части строки по регулярному выражению A на выражение B, и всё.
Вернее даже не так.
На замена выполняется, а если обнаруживается сопоставление с A , то выполняется запрос B с учетом модификаторов [C]
Переменные возникнут (или не возникнут) позже, когда запрос будет (или не будет) отдан php .

  Ответить  
 
 автор: LINKIN   (03.02.2010 в 11:05)   письмо автору
 
   для: Trianon   (03.02.2010 в 00:56)
 

Я не понимаю. Я хочу добиться переадресации с index.php?action=about&lang=ru на /ru/about.html. Пишу
RewriteRule ^([a-z0–9]+)/([a-z0–9]+)\.html$ index.php?action=$2&lang=$1

Что-то не так?

  Ответить  
 
 автор: Trianon   (03.02.2010 в 16:08)   письмо автору
 
   для: LINKIN   (03.02.2010 в 11:05)
 

>Я хочу добиться переадресации с index.php?action=about&lang=ru на /ru/about.html.

А по-моему - как раз наоборот.

  Ответить  
 
 автор: LINKIN   (03.02.2010 в 18:42)   письмо автору
 
   для: Trianon   (03.02.2010 в 16:08)
 

Хорошо. Я вообще в статьях именно такой принцип вычитывал. Как тогда сделать? Что необходимо написать чтобы добиться такого результата.
Сейчас ссылка index.php?action=company&lang=ru
Мне надо /ru/company.html

  Ответить  
 
 автор: Trianon   (03.02.2010 в 19:25)   письмо автору
 
   для: LINKIN   (03.02.2010 в 18:42)
 

>Хорошо. Я вообще в статьях именно такой принцип вычитывал. Как тогда сделать? Что необходимо написать чтобы добиться такого результата.
>Сейчас ссылка index.php?action=company&lang=ru
>Мне надо /ru/company.html

Перевожу на русский язык.

У Вас имеются:

1) ссылка в html-коде вида <a href=/ru/company.html >ссылка</a>
2) cкрипт, который умеет обрабатывать запрос вида index.php?action=company&lang=ru

Вы желаете, чтобы сервер, воспринимающий запрос по ссылке(1), пересылал/перенаправлял/переадресовывал его (запрос) скрипту (2) перед непосредственно обработкой. С сохранением функциональности - то есть работоспособным образом.

Только так и никак иначе.

  Ответить  
 
 автор: LINKIN   (03.02.2010 в 19:50)   письмо автору
 
   для: Trianon   (03.02.2010 в 19:25)
 

Ситуация полностью наоборот. В убеждаете что mod_rewrite предназначен для переделки /ru/company.htm в index.php?action=company&lang=ru, а не наоброт?

У меня имеется
1) ссылка в html-коде виде index.php?action=company&lang=ru
У меня не имеется, но необходим
2) скрипт, который ссылку index.php?action=company&lang=ru переделывает в /ru/company.htm

Я желаю, чтобы сервер, принимающий запрос по ссылке (1) подставлял виртуальную ссылку (2) в поле ссылки браузера.

  Ответить  
 
 автор: Trianon   (03.02.2010 в 21:19)   письмо автору
 
   для: LINKIN   (03.02.2010 в 19:50)
 

>В убеждаете что mod_rewrite предназначен для переделки /ru/company.htm в index.php?action=company&lang=ru, а не наоброт?

Я знаю, для чего предназначен этот инструмент.
Убеждать в чем-либо кого-либо против его воли я буду лишь за отдельные деньги.


>Ситуация полностью наоборот.

Что ж, давайте попробуем рассмотреть.

>У меня имеется
>1) ссылка в html-коде виде index.php?action=company&lang=ru

Хорошо. Есть ссылка, при клике порождающая запрос GET index.php?action=company&lang=ru


>У меня не имеется, но необходим
>2) скрипт, который ссылку index.php?action=company&lang=ru переделывает ...

Скрипты не переделывают ссылки. Скрипты обрабатывают запросы.
php-скрипт index.php способен обработать запрос (1) без помощи рерайтов.

>...в /ru/company.htm

>Я желаю, чтобы сервер, принимающий запрос по ссылке (1) подставлял виртуальную ссылку (2) в поле ссылки браузера.

полем ссылки Вы называете очевидно адресную строку браузера.
поставить туда скрипт может всё что угодно безо всякого рерайта, безо всяких регулярок.
Делается это вызовом функций header("Location: другой_адрес"); exit();
Но ведь браузер же по этому адресу /ru/company.htm тут же сделает попытку перейти!
И тогда мы придем к тому, с чего начали диалог.
Потребуется, чтобы сервер перенаправлял запрос /ru/company.htm скрипту index.php?action=company&lang=ru перед непосредственной обработкой.

  Ответить  
 
 автор: LINKIN   (03.02.2010 в 21:48)   письмо автору
 
   для: Trianon   (03.02.2010 в 21:19)
 

Ок. Все принимается. Объясните тогда мне как реализовано вот это
http://tsn.ua/ukrayina/prognoz-pogodi-v-ukrayini-na-chetver-4-lyutogo.html

  Ответить  
 
 автор: Trianon   (03.02.2010 в 22:50)   письмо автору
 
   для: LINKIN   (03.02.2010 в 21:48)
 

Одно из трех.
Либо именно по описанному принципу
Переброс с кучерявой ссылки на скриптовый жесткий адрес типа daily_wheater.php?day=chetver-4-lyutogo

Либо статический файл с прогнозом и с длинным именем.

Либо первый вариант, формирующий кешированный статический файл с длинным именем, и последующий переброс на него.
(в рамках 404-го обработчика)

  Ответить  
 
 автор: LINKIN   (03.02.2010 в 23:39)   письмо автору
 
   для: Trianon   (03.02.2010 в 22:50)
 

Так а как? Хочешь сказать, что они гетами передают тайтлы?

  Ответить  
 
 автор: Trianon   (04.02.2010 в 00:09)   письмо автору
 
   для: LINKIN   (03.02.2010 в 23:39)
 

Чисто технически ничего сложного нет.
Скрипт получил строку, обратился к SQL-серверу с запросом, какому внутреннему документу (или скрипту) соответствует тайтл-адрес, получил ответ, загрузил документ/выполнил скрипт.
Правда, делать эту технологию именно для прогноза погоды на указанное число - кич (никому не нужный выпендреж иными словами).

  Ответить  
 
 автор: LINKIN   (03.02.2010 в 01:35)   письмо автору
 
   для: Trianon   (02.02.2010 в 16:01)
 

Запрос
index.php?action=about&lang=ru

Делаю
RewriteRule ^([a-z0–9]+)/([a-z0–9]+)\.html$ index.php?action=$2&lang=$1

Результата нету вообще.

  Ответить  
 
 автор: heed   (03.02.2010 в 20:34)   письмо автору
 
   для: LINKIN   (03.02.2010 в 01:35)
 

>например RewriteCond %{QUERY_STRING} ^id=([0-9]+)&parent=([0-9]+)

как я и говорил, это только с RewriteCond и переадресацией для того чтобы в браузер дать другую ссылку

например ссылка обязятельно имеет первым параметром
action="слово"
, а вторым
lang=ru
, index.php как-бы должен-бы лежать в корне сайта, тогда будет примерно так

Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^action=([a-z_]+)&lang=([a-z]+)
# Rule будет обрабатываться только в случае совпадения в Cond
RewriteRule ^index.php$ %2/%1.html [R]
# [R] - переадресация
# не проверял

  Ответить  
 
 автор: LINKIN   (03.02.2010 в 00:48)   письмо автору
 
   для: LINKIN   (02.02.2010 в 15:56)
 

В общем, слева-направо. Это что, тяжело сказать или вы сами не разбираетесь?

  Ответить  
 
 автор: .heed   (03.02.2010 в 10:56)
 
   для: LINKIN   (03.02.2010 в 00:48)
 

>первый параметр выражение, которое сопоставляется с REQUEST_URI

т.е. наоборот под такое правило должен запрос x123/1.html
перенаправляться на index.php?action=1&lang=x123

какой браузер отправляет запрос зависит от href в ссылке или от action в форме, mod_rewrite просто запрос проверяет на совпадение с например x123/1.html или en/posting.html относительно текущего каталога или RewriteBase , если было

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования