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

Форум Apache

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: mod_rewrite: правила для GET-параметров

Сообщения:  [1-10]   [11-15] 

 
 автор: cheops   (13.04.2011 в 15:17)   письмо автору
 
   для: Alph[p]a   (13.04.2011 в 14:40)
 

>где REQUEST_FILENAME - это что ?
REQUEST_FILENAME - это имя файла к которому вы обращаетесь.

  Ответить  
 
 автор: cheops   (13.04.2011 в 15:16)   письмо автору
 
   для: Alph[p]a   (13.04.2011 в 14:40)
 

>что здесь захватывает маска (.*) ?
Все захватывает. Это условие захватывает всю строку запроса (правда из-за RewriteRule отсекаются все GET-запросы, т.е. ? и все дальше).

  Ответить  
 
 автор: Alph[p]a   (13.04.2011 в 14:40)   письмо автору
 
   для: cheops   (13.04.2011 в 14:21)
 

вроде понял... но еще один момент...
вот

RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d   
RewriteRule (.*) index.php?run=$1 [L]

RewriteCond - определяет условие ??! где REQUEST_FILENAME - это что ? и
RewriteRule (.*) index.php?run=$1 [L] - что здесь захватывает маска (.*) ?

человеческим языком не могу описать.... если понятно то поясните и это.

  Ответить  
 
 автор: cheops   (13.04.2011 в 14:21)   письмо автору
 
   для: Alph[p]a   (13.04.2011 в 14:13)
 

Дело в том, что первое правило
RewriteRule (.*) index.php?run=$1&q=%1 [L]
сработает только если будет выполнено условие
RewriteCond %{QUERY_STRING} ^q=(.*)
Т.е. в строке запроса появится фрагмент ?q=, если такого фрагмента нет, то обработчик модуля mod_rewrite идет дальше к правилу
RewriteRule (.*) index.php?run=$1 [L]
Аналогично наоборот, если в строке запроса есть ?q=, то сработает первое правило (RewriteRule), а [L] не даст mod_rewrite идти дальше.

>откуда строчка RewriteRule (.*) index.php?run=$1&q=%1 [L] получает $1 если оно описывается
>только тут RewriteRule (.*) index.php?run=$1 [L]... извините за бред...
На самом деле $1 это просто ссылка на первые скобки в RewriteRule, у вас два RewriteRule и у каждого есть скобки (.*), именно на них ссылается $1.

  Ответить  
 
 автор: Alph[p]a   (13.04.2011 в 14:13)   письмо автору
 
   для: cheops   (13.04.2011 в 13:53)
 


.........
RewriteCond %{QUERY_STRING} ^q=(.*) 
RewriteRule (.*) index.php?run=$1&q=%1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteRule (.*) index.php?run=$1 [L]
.........


RewriteRule (.*) index.php?run=$1&q=%1 [L] - здесь ссылка на RewriteRule (.*) index.php?run=$1 [L]

интересно... если стоит флаг [L] у RewriteRule (.*) index.php?run=$1&q=%1 [L]
то как он ПОЛУЧАЕТ $1 если он должен прекращать поиск из за флага...
откуда строчка RewriteRule (.*) index.php?run=$1&q=%1 [L] получает $1 если оно описывается только тут RewriteRule (.*) index.php?run=$1 [L]... извините за бред...

сможете пояснить?

  Ответить  
 
 автор: cheops   (13.04.2011 в 13:53)   письмо автору
 
   для: Alph[p]a   (13.04.2011 в 13:40)
 

%1 это из регулярного выражения RewriteCond. Дело в том, что RewriteRule отсекает все, что после ?, и добраться до GET-параметров можно только через парсинг строки запроса %{QUERY_STRING} в RewriteCond. Причем ссылки на скобки в RewriteRule начинаются с $, а ссылки на скобки в RewriteCond начинаются с %.

  Ответить  
 
 автор: Alph[p]a   (13.04.2011 в 13:40)   письмо автору
 
   для: cheops   (13.04.2011 в 13:19)
 

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


RewriteCond %{QUERY_STRING} ^q=(.*) 
RewriteRule (.*) index.php?run=$1&q=%1 [L]

поясните это

%1 - что это такое и откуда?

  Ответить  
 
 автор: cheops   (13.04.2011 в 13:19)   письмо автору
 
   для: Alph[p]a   (13.04.2011 в 13:01)
 

Т.е. у вас получается запрос вида
local/certificate/ajaxname?q=запрос
преобразовать это дело надо в
index.php?run=certificate/ajaxname&q=запрос
Тогда следует использовать следующие правила
RewriteEngine On 
RewriteCond %{QUERY_STRING} ^q=(.*)
RewriteRule (.*) index.php?run=$1&q=%1 [L]
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule (.*) index.php?run=$1 [L]

  Ответить  
 
 автор: Alph[p]a   (13.04.2011 в 13:01)   письмо автору
 
   для: cheops   (13.04.2011 в 12:02)
 

попытаюсь описать....

есть JS скрипт который при событии на странице local/certificate отсылаем данные гетом на страницу
local/certificate/ajaxname но на этой странице $_GET['q'] теряется как будто не доходит.
параметр run нужен контроллеру он трогаться не должен т.к он отображает страницу.

если я убираю htaccess и ставлю скрипту отсылать данные на index.php?run=certificate/ajaxname
то все работает.

помоги ув. хеопс

  Ответить  
 
 автор: cheops   (13.04.2011 в 12:02)   письмо автору
 
   для: Alph[p]a   (13.04.2011 в 11:58)
 

Так, т.е. вы набираете просто localhost/certificate/? И certificate должно попасть в параметр q, и не должно попасть в параметр run? А какие критерии попадания в тот или иной параметр (у меня перед глазами вашей системы нет, поэтому нужно бы больше подробностей).

  Ответить  

Сообщения:  [1-10]   [11-15] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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