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