ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: FastCGI, $query_string и PHP (Drupal)



01.02.08, Igor Sysoev <is@xxxxxxxxxxxxx> написал(а):
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




 




Copyright © Lexa Software, 1996-2009.