|
|
|
| Не думал что. такое случится, но я забыл многое в 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) (последовательно, слева направо?) идет прописываться в каждую круглую скобку? Вот, и какую роль тогда здесь играют регулярные выражения? | |
|
|
|
|
|
|
|
для: LINKIN
(02.02.2010 в 15:56)
| | принцип работы рерайта куда проще понять, если изучить регулярки сперва . А не потом.
фактически рерайт это что-то вроде ereg_replace, встроенный в апач на нижнем уровне перед обработкой запроса. | |
|
|
|
|
|
|
|
для: Trianon
(02.02.2010 в 16:01)
| | Ок. Прочитал регулярные выражения. Разобрался. Но суть вопрос эта не изменило. Как строки обменивается переменными? | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: LINKIN
(02.02.2010 в 22:46)
| | никак не обмениваются.
На этапе рерайта нет никаких переменных.
Просто выполняется замена сопоставленной части строки по регулярному выражению A на выражение B, и всё.
Вернее даже не так.
На замена выполняется, а если обнаруживается сопоставление с A , то выполняется запрос B с учетом модификаторов [C]
Переменные возникнут (или не возникнут) позже, когда запрос будет (или не будет) отдан php . | |
|
|
|
|
|
|
|
для: 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
|
Что-то не так? | |
|
|
|
|
|
|
|
для: LINKIN
(03.02.2010 в 11:05)
| | >Я хочу добиться переадресации с index.php?action=about&lang=ru на /ru/about.html.
А по-моему - как раз наоборот. | |
|
|
|
|
|
|
|
для: Trianon
(03.02.2010 в 16:08)
| | Хорошо. Я вообще в статьях именно такой принцип вычитывал. Как тогда сделать? Что необходимо написать чтобы добиться такого результата.
Сейчас ссылка index.php?action=company&lang=ru
Мне надо /ru/company.html | |
|
|
|
|
|
|
|
для: 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) перед непосредственно обработкой. С сохранением функциональности - то есть работоспособным образом.
Только так и никак иначе. | |
|
|
|
|
|
|
|
для: 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) в поле ссылки браузера. | |
|
|
|
|
|
|
|
для: 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 перед непосредственной обработкой. | |
|
|
|
|
|
|
|
для: Trianon
(03.02.2010 в 21:19)
| | Ок. Все принимается. Объясните тогда мне как реализовано вот это
http://tsn.ua/ukrayina/prognoz-pogodi-v-ukrayini-na-chetver-4-lyutogo.html | |
|
|
|
|
|
|
|
для: LINKIN
(03.02.2010 в 21:48)
| | Одно из трех.
Либо именно по описанному принципу
Переброс с кучерявой ссылки на скриптовый жесткий адрес типа daily_wheater.php?day=chetver-4-lyutogo
Либо статический файл с прогнозом и с длинным именем.
Либо первый вариант, формирующий кешированный статический файл с длинным именем, и последующий переброс на него.
(в рамках 404-го обработчика) | |
|
|
|
|
|
|
|
для: Trianon
(03.02.2010 в 22:50)
| | Так а как? Хочешь сказать, что они гетами передают тайтлы? | |
|
|
|
|
|
|
|
для: LINKIN
(03.02.2010 в 23:39)
| | Чисто технически ничего сложного нет.
Скрипт получил строку, обратился к SQL-серверу с запросом, какому внутреннему документу (или скрипту) соответствует тайтл-адрес, получил ответ, загрузил документ/выполнил скрипт.
Правда, делать эту технологию именно для прогноза погоды на указанное число - кич (никому не нужный выпендреж иными словами). | |
|
|
|
|
|
|
|
для: 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
|
Результата нету вообще. | |
|
|
|
|
|
|
|
для: 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
(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 , если было | |
|
|
|