Что-то никак не могу нарыть в документации: возникла элементарная задача при запросе
/articles.php?id=1 сделать внешний редирект.Естественно, первое приходящее в голову условие:
RewriteCond %{REQUEST_URI} =/articles.php?id=1
Не срабатывает, по логам видно, что в подстановку приходит /articles.php
[perdir /var/www/htdocs/] RewriteCond: input='/articles.php' pattern='=/articles.php?id=1' => not-matched
Собственно, почему не работает правило понятно, и сделаю то же самое на %{THE_REQUEST}, но хотелось бы понять, почему $_SERVER['REQUEST_URI'] в php содержит логичное "/articles.php?id=1", а для mod_rewrite QUERY часть, получается, отбрасывается.
а что параллельно говорит access.log ? :)
> а что параллельно говорит access.log ? :)А, что и должен, по типу:
127.0.0.1 - - [05/Mar/2011:15:44:09 +0200] "GET /articles.php?id=134 HTTP/1.1" 404 210
127.0.0.1 - - [05/Mar/2011:15:50:25 +0200] "GET /articles.php?id=134 HTTP/1.1" 404 210Файла нету, да и быть не обязан.
> Что-то никак не могу нарыть в документации: возникла элементарная задача при запросе
> /articles.php?id=1 сделать внешний редирект.
> Естественно, первое приходящее в голову условие:
> RewriteCond %{REQUEST_URI} =/articles.php?id=1
> Не срабатывает, по логам видно, что в подстановку приходит /articles.php
> [perdir /var/www/htdocs/] RewriteCond: input='/articles.php' pattern='=/articles.php?id=1'
> => not-matched
> Собственно, почему не работает правило понятно, и сделаю то же самое на
> %{THE_REQUEST}, но хотелось бы понять, почему $_SERVER['REQUEST_URI'] в php содержит логичное
> "/articles.php?id=1", а для mod_rewrite QUERY часть, получается, отбрасывается.а маскировать ничего не надо?
> а маскировать ничего не надо?Не уверен - там же типа лексическое равенство, эт опытно проверить надо, в принципе.
Но в данном случае роли никакой не играет - это я еще на Мастерхосте сперва мучился, там маскировать пробовал по всякому, а потом на локале тестировать начал, т.к. зацепило, а на мастерхосте не логируется mod_rewrite.
Ключевое там - что в инпуте идет "RewriteCond: input='/articles.php'", так что паттерн не важен.
Вот, кстати, полный лог:
127.0.0.1 - - [05/Mar/2011:15:43:52 +0200] [/sid#7f7a06af8d98][rid#7f7a06ee0e38/initial] (1) [perdir /var/www/htdocs/] pass through /var/www/htdocs/articles.php
127.0.0.1 - - [05/Mar/2011:15:44:09 +0200] [/sid#7f7a06af8d98][rid#7f7a06eeffa8/initial] (3) [perdir /var/www/htdocs/] strip per-dir prefix: /var/www/htdocs/articles.php -> articles.php
127.0.0.1 - - [05/Mar/2011:15:44:09 +0200] [/sid#7f7a06af8d98][rid#7f7a06eeffa8/initial] (3) [perdir /var/www/htdocs/] applying pattern '^.*$' to uri 'articles.php'
127.0.0.1 - - [05/Mar/2011:15:44:09 +0200] [/sid#7f7a06af8d98][rid#7f7a06eeffa8/initial] (4) [perdir /var/www/htdocs/] RewriteCond: input='' pattern='=/articles.php?id=134' => not-matchedА вот как приходит в "правильной" проверке через %{THE_REQUEST}
127.0.0.1 - - [05/Mar/2011:16:20:48 +0200] [/sid#7f7a06af8d98][rid#7f7a06eeffa8/initial] (4) [perdir /var/www/htdocs/] RewriteCond: input='GET /articles.
php?id=134 HTTP/1.1' pattern='^[A-Z]{3,9}\ /articles\.php\?id=134\ HTTP/' => matched
>[оверквотинг удален]
> articles.php
> 127.0.0.1 - - [05/Mar/2011:15:44:09 +0200] [/sid#7f7a06af8d98][rid#7f7a06eeffa8/initial]
> (3) [perdir /var/www/htdocs/] applying pattern '^.*$' to uri 'articles.php'
> 127.0.0.1 - - [05/Mar/2011:15:44:09 +0200] [/sid#7f7a06af8d98][rid#7f7a06eeffa8/initial]
> (4) [perdir /var/www/htdocs/] RewriteCond: input='' pattern='=/articles.php?id=134'
> => not-matched
> А вот как приходит в "правильной" проверке через %{THE_REQUEST}
> 127.0.0.1 - - [05/Mar/2011:16:20:48 +0200] [/sid#7f7a06af8d98][rid#7f7a06eeffa8/initial]
> (4) [perdir /var/www/htdocs/] RewriteCond: input='GET /articles.
> php?id=134 HTTP/1.1' pattern='^[A-Z]{3,9}\ /articles\.php\?id=134\ HTTP/' => matchedну так и почувствуйте разницу: точки, пробелы, слэши и вопросительный знак замаскированы
>> а маскировать ничего не надо?
> Не уверен - там же типа лексическое равенство, эт опытно проверить надо,
> в принципе.
> ...
> А вот как приходит в "правильной" проверке через %{THE_REQUEST}
> ...ну так и почувствуйте разницу: точки, пробелы, слэши и вопросительный знак замаскированы
> ну так и почувствуйте разницу: точки, пробелы, слэши и вопросительный знак замаскированыу вас просто повысказываться потребность существует?
еще раз рекомендую посмотреть на то, что в input-е по логам приходит, а не на то, что по pattern-у сверяется. таки почувствуйте разницу. ой-вэй.
> Что-то никак не могу нарыть в документации: возникла элементарная задача при запросе
> /articles.php?id=1 сделать внешний редирект.А что-то в articles.php мешает дописать следующее
if ($_GET['id'] == 1) {
header("Location: http://opennet.ru/");
}
> А что-то в articles.php мешает дописать следующее
> if ($_GET['id'] == 1) {
> header("Location: http://opennet.ru/");
> }Например то, что вопрос мой касается поведения mod_rewrite, а не того, как мне решить задачу (решенную сразу), тем более что в теме это указано явно.
Если задача решена, то какой смысл в применении mod_rewrite? Спортивный интерес?
> Если задача решена, то какой смысл в применении mod_rewrite? Спортивный интерес?Смысл в том, чтобы понимать как что работает.
"но хотелось бы понять, почему $_SERVER['REQUEST_URI'] в php содержит логичное "/articles.php?id=1", а для mod_rewrite QUERY часть, получается, отбрасывается."
Учитывая то, что я перерыл по ходу оф. документацию, и как только мог придумать прогуглил, туманность этой мелочной заподлистости хотелось бы рассеять.
К тому же день спустя опять затык другого свойства, опять же на REQUEST_URI, но там доступа к логам нет никакого, потому только по симптоматике вижу, что фигня творится.
Где-то что-то мимоходом проскакивало про изменения в Apache 2.x, но без конкретики.
> [perdir /var/www/htdocs/] RewriteCond: input='/articles.php' pattern='=/articles.php?id=1'Шаблон со знаком равно подставляется.
А так срабатывает?RewriteCond %{REQUEST_URI} /articles.php?id=1
Заинтересовали вы меня)))RewriteEngine on
RewriteCond %{REQUEST_URI} /articles.php
RewriteCond %{QUERY_STRING} id=1
RewriteRule (.*) 1.php
> Заинтересовали вы меня)))
> RewriteEngine on
> RewriteCond %{REQUEST_URI} /articles.php
> RewriteCond %{QUERY_STRING} id=1
> RewriteRule (.*) 1.phpНет, ну вы правы, конечно - ваша конструкция сработает, как и использованная мною
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /articles\.php\?id=134\ HTTP/
Но вопрос-то в том, чтобы понять, на основании чего появляется разница в представлении REQUEST_URI для mod_rewrite, и для, скажем просто, модуля php.
Т.е. понимая проявление проблемы, меня главным образом зацепило то, что ничего не могу найти на этот счет в документации. Ведь если URI - это Uniform Resource Identifier, то идентифицировать-то оно должно по полному адресу запроса, т.е. содержать в REQUEST_URI /articles.php?id=1
В смысле - мол, ну какой же это REQUEST_URI, если это скорее SCRIPT_FILENAME или REQUEST_FILENAMEЛично мне это важно выяснить поскольку возможности для отладки правил m_r крайне скудны.
Согласно RFC http://www.ietf.org/rfc/rfc3986.txt URI должен нести в себе даже адрес фрагмента, но передача его на сервер не производится браузерами.Согласно описания структуры struct request_rec (778 строка)
http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/incl.../** The path portion of the URI, or "/" if no path provided */
946 char *uri;/** The QUERY_ARGS extracted from this request */
955 char *args;Судя по всему mod_rewrite и использует вот эту трактовку REQUEST_URI.
> Судя по всему mod_rewrite и использует вот эту трактовку REQUEST_URI.Спасибо! В сырцы заглянуть как-то и не подумалось