URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 7166
[ Назад ]

Исходное сообщение
"mod_rewrite - странность с %{REQUEST_URI}"

Отправлено reivaX , 05-Мрт-11 17:11 
Что-то никак не могу нарыть в документации: возникла элементарная задача при запросе
/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 - странность с %{REQUEST_URI}"
Отправлено Pahanivo , 05-Мрт-11 17:41 
а что параллельно говорит access.log ? :)

"mod_rewrite - странность с %{REQUEST_URI}"
Отправлено reivaX , 05-Мрт-11 23:25 
> а что параллельно говорит 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

Файла нету, да и быть не обязан.


"mod_rewrite - странность с %{REQUEST_URI}"
Отправлено Aquarius , 05-Мрт-11 19:09 
> Что-то никак не могу нарыть в документации: возникла элементарная задача при запросе
> /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 - странность с %{REQUEST_URI}"
Отправлено reivaX , 05-Мрт-11 23:33 
> а маскировать ничего не надо?

Не уверен - там же типа лексическое равенство, эт опытно проверить надо, в принципе.

Но в данном случае роли никакой не играет - это я еще на Мастерхосте сперва мучился, там маскировать пробовал по всякому, а потом на локале тестировать начал, т.к. зацепило, а на мастерхосте не логируется 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


"mod_rewrite - странность с %{REQUEST_URI}"
Отправлено Aquarius , 06-Мрт-11 02:57 
>[оверквотинг удален]
> 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

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


"mod_rewrite - странность с %{REQUEST_URI}"
Отправлено Aquarius , 06-Мрт-11 02:59 
>> а маскировать ничего не надо?
> Не уверен - там же типа лексическое равенство, эт опытно проверить надо,
> в принципе.
> ...
> А вот как приходит в "правильной" проверке через %{THE_REQUEST}
> ...

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


"mod_rewrite - странность с %{REQUEST_URI}"
Отправлено reivaX , 06-Мрт-11 23:11 
> ну так и почувствуйте разницу: точки, пробелы, слэши и вопросительный знак замаскированы

у вас просто повысказываться потребность существует?

еще раз рекомендую посмотреть на то, что в input-е по логам приходит, а не на то, что по pattern-у сверяется. таки почувствуйте разницу. ой-вэй.




"mod_rewrite - странность с %{REQUEST_URI}"
Отправлено zoonman , 06-Мрт-11 17:45 
> Что-то никак не могу нарыть в документации: возникла элементарная задача при запросе
> /articles.php?id=1 сделать внешний редирект.

А что-то в articles.php мешает дописать следующее

if ($_GET['id'] == 1) {
header("Location: http://opennet.ru/");
}


"mod_rewrite - странность с %{REQUEST_URI}"
Отправлено reivaX , 06-Мрт-11 23:16 
> А что-то в articles.php мешает дописать следующее
> if ($_GET['id'] == 1) {
>  header("Location: http://opennet.ru/");
> }

Например то, что вопрос мой касается поведения mod_rewrite, а не того, как мне решить задачу (решенную сразу), тем более что в теме это указано явно.


"mod_rewrite - странность с %{REQUEST_URI}"
Отправлено zoonman , 06-Мрт-11 23:25 
Если задача решена, то какой смысл в применении mod_rewrite? Спортивный интерес?

"mod_rewrite - странность с %{REQUEST_URI}"
Отправлено reivaX , 07-Мрт-11 00:00 
> Если задача решена, то какой смысл в применении mod_rewrite? Спортивный интерес?

Смысл в том, чтобы понимать как что работает.

"но хотелось бы понять, почему $_SERVER['REQUEST_URI'] в php содержит логичное "/articles.php?id=1", а для mod_rewrite QUERY часть, получается, отбрасывается."

Учитывая то, что я перерыл по ходу оф. документацию, и как только мог придумать прогуглил, туманность этой мелочной заподлистости хотелось бы рассеять.

К тому же день спустя опять затык другого свойства, опять же на REQUEST_URI, но там доступа к логам нет никакого, потому только по симптоматике вижу, что фигня творится.

Где-то что-то мимоходом проскакивало про изменения в Apache 2.x, но без конкретики.


"mod_rewrite - странность с %{REQUEST_URI}"
Отправлено zoonman , 07-Мрт-11 00:45 
> [perdir /var/www/htdocs/] RewriteCond: input='/articles.php' pattern='=/articles.php?id=1'

Шаблон со знаком равно подставляется.


А так срабатывает?

RewriteCond %{REQUEST_URI} /articles.php?id=1


"mod_rewrite - странность с %{REQUEST_URI}"
Отправлено zoonman , 07-Мрт-11 01:18 
Заинтересовали вы меня)))

RewriteEngine on

RewriteCond %{REQUEST_URI} /articles.php
RewriteCond %{QUERY_STRING} id=1
RewriteRule (.*)    1.php


"mod_rewrite - странность с %{REQUEST_URI}"
Отправлено reivaX , 07-Мрт-11 01:56 
> Заинтересовали вы меня)))
> 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 крайне скудны.


"mod_rewrite - странность с %{REQUEST_URI}"
Отправлено zoonman , 07-Мрт-11 08:43 
Согласно 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}"
Отправлено reivaX , 07-Мрт-11 12:53 

> Судя по всему mod_rewrite и использует вот эту трактовку REQUEST_URI.

Спасибо! В сырцы заглянуть как-то и не подумалось