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

Форум Apache

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

 

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

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

тема: mod_rewrite: правила для GET-параметров
 
 автор: Alph[p]a   (13.04.2011 в 11:00)   письмо автору
 
 

вот мой файл .htaccess

# отдаем все документы в utf-8
AddType "text/html; charset=utf-8" .php
AddDefaultCharset utf-8

php_value display_errors 1
php_value display_startup_errors 1

# обрабатываем ошибки
ErrorDocument 404 /index.php?run=402
ErrorDocument 403 /index.php?run=403 
ErrorDocument 400 /index.php?run=404 
ErrorDocument 500 /index.php?run=404

# url преобразования
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?run=$1 [L]


как мне сделать так чтобы GET запросы а именно $_GET[q] шли не через него!?!?

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

Перед этими условиями и правилами, поставьте условие и правило, которые будут реагировать на q= в строке запроса
...
RewriteEngine On
RewriteCond %{QUERY_STRING} ^q=
RewriteRule (.*) index.php?q=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule (.*) index.php?run=$1 [L]

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

хмм...
я переделал вот так

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

но в index.php?run=certificate/ajaxname&q=test получаю это

    [run] => certificate/ajaxname
    [q] => certificate/ajaxname/


почему $q теряется в небытие... и всегда равна $_GET['run']
что это может быть?

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

Как выглядит адрес от корня который вводите и которое хотите отловить первым правилом? И что хотите, чтобы легло в $1?

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

в $1 из JS скрипта отсылается инфа..
адрес - localhost/certificate/

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

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

  Ответить  
 
 автор: 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 в 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: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:53)   письмо автору
 
   для: Alph[p]a   (13.04.2011 в 13:40)
 

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

  Ответить  
 
 автор: 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 в 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: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 в 15:16)   письмо автору
 
   для: Alph[p]a   (13.04.2011 в 14:40)
 

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

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

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

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

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