Re: FastCGI, $query_string и PHP (Drupal)

Михаил Лапшин sotakone at sotakone.com
Fri Feb 1 22:13:28 MSK 2008


01.02.08, Igor Sysoev <is at rambler-co.ru> написал(а):
>
> On Fri, Feb 01, 2008 at 06:40:14PM +0600, Михаил Лапшин wrote:
>
> > Добрый день. Есть nginx 0.5.26, под ним через FastCGI бегает PHP
> (Drupal).
> > Проблема, наверное, известная, и подобный вопрос не раз задавался, но
> > решения я так и не нашел.
> >
> > Вообщем, пользователь вводит в форму поиска строку, например,
> "пластиковые
> > окна". Браузер отправляет запрос:
> > GET /search/node/пластиковые+окна HTTP/1.1
> >
> > Этот запрос через реврайт преобразуется в следующий:
> > GET /index.php?q=search/node/пластиковые+окна HTTP/1.1
> >
> > Однако, FactCGI-серверу query string передается заэскейпенный (%2B
> вместо
> > +):
> > GET /index.php?q=search/node/пластиковые%2Bокна HTTP/1.1
> >
> > Таким образом, "пластиковые окна" превращаются в "пластиковые+окна".
>
> И это правильно.


Видимо, да. Я считал, что проблема в query string, т.к. под Apache/mod_php
все работает правильно, а под nginx/fastcgi появляется вышеописаная
проблема. Однако я сравнил вывод phpinfo() (глобальные переменные $_GET,
$_REQUEST и $_SERVER) под этими двумя серверами, и они оказались
идентичными. Так что, если я нигде не ошибся, то причину нужно искать не в
веб-сервере, а в кишках Drupal. Хотя я даже представить не могу, в чем
именно она заключается. Пока сделал так:

if (strpos($_SERVER['SERVER_SOFTWARE'], 'nginx') !== false) {
  $_GET["q"] = urldecode($_GET["q"]);
}

Для меня работает, но вообще больше похоже на хак.

> Вопрос: как получить незаэскейпенную $query_string в конфиге и передать ее
> > FastCGI? Или как по-другому решить эту проблему?
> >
> > Куски конфига:
> >
> > # Реврайтинг
> >
> >    if (!-e $request_filename) {
> >       rewrite ^/(.*)$ /index.php?q=$1 last;
> >       break;
> >    }
> >
> > # PHP
> >   location ~ .php$ {
> >     fastcgi_pass   127.0.0.1:8888;
> >     fastcgi_index  index.php;
> >
> >
> fastcgi_param  SCRIPT_FILENAME  /var/www/xxxxxxxxx$fastcgi_script_name;
> >     fastcgi_param  QUERY_STRING     $query_string;
>
> -     fastcgi_param  QUERY_STRING     $query_string;
> +     fastcgi_param  QUERY_STRING     $request_uri;


Так я уже пробовал, но тогда PHP не инициализирует хэши $_REQUEST и $_GET.
Видимо, ему мешает распарсить "/index.php?" в начале строки, что вполне
логично.

>     fastcgi_param  REQUEST_URI      $request_uri;
> >     fastcgi_param  REQUEST_METHOD   $request_method;
> >     fastcgi_param  CONTENT_TYPE     $content_type;
> >     fastcgi_param  CONTENT_LENGTH   $content_length;
> >     fastcgi_param  REMOTE_USER      $remote_user;
> >     fastcgi_param  REMOTE_ADDR      $remote_addr;
> >     fastcgi_param  REMOTE_PORT      $remote_port;
> >   }
>
>
> --
> Игорь Сысоев
> http://sysoev.ru
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx-ru/attachments/20080202/2cf71382/attachment.html>


More information about the nginx-ru mailing list