01.02.08, <b class="gmail_sendername">Igor Sysoev</b> <<a href="mailto:is@rambler-co.ru">is@rambler-co.ru</a>> написал(а):<div><span class="gmail_quote"></span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
On Fri, Feb 01, 2008 at 06:40:14PM +0600, Михаил Лапшин wrote:<br><br>> Добрый день. Есть nginx 0.5.26, под ним через FastCGI бегает PHP (Drupal).<br>> Проблема, наверное, известная, и подобный вопрос не раз задавался, но<br>
> решения я так и не нашел.<br>><br>> Вообщем, пользователь вводит в форму поиска строку, например, "пластиковые<br>> окна". Браузер отправляет запрос:<br>> GET /search/node/пластиковые+окна HTTP/1.1<br>
><br>> Этот запрос через реврайт преобразуется в следующий:<br>> GET /index.php?q=search/node/пластиковые+окна HTTP/1.1<br>><br>> Однако, FactCGI-серверу query string передается заэскейпенный (%2B вместо<br>
> +):<br>> GET /index.php?q=search/node/пластиковые%2Bокна HTTP/1.1<br>><br>> Таким образом, "пластиковые окна" превращаются в "пластиковые+окна".<br><br>И это правильно.</blockquote><div><br>
Видимо, да. Я считал, что проблема в query string, т.к. под Apache/mod_php все работает правильно, а под nginx/fastcgi появляется вышеописаная проблема. Однако я сравнил вывод phpinfo() (глобальные переменные $_GET, $_REQUEST и $_SERVER) под этими двумя серверами, и они оказались идентичными. Так что, если я нигде не ошибся, то причину нужно искать не в веб-сервере, а в кишках Drupal. Хотя я даже представить не могу, в чем именно она заключается. Пока сделал так:<br>
<br>if (strpos($_SERVER['SERVER_SOFTWARE'], 'nginx') !== false) {<br>
$_GET["q"] = urldecode($_GET["q"]);<br>
}<br>
<br>Для меня работает, но вообще больше похоже на хак.<br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">> Вопрос: как получить незаэскейпенную $query_string в конфиге и передать ее<br>
> FastCGI? Или как по-другому решить эту проблему?<br>><br>> Куски конфига:<br>><br>> # Реврайтинг<br>><br>> if (!-e $request_filename) {<br>> rewrite ^/(.*)$ /index.php?q=$1 last;<br>> break;<br>
> }<br>><br>> # PHP<br>> location ~ .php$ {<br>> fastcgi_pass <a href="http://127.0.0.1:8888">127.0.0.1:8888</a>;<br>> fastcgi_index index.php;<br>><br>> fastcgi_param SCRIPT_FILENAME /var/www/xxxxxxxxx$fastcgi_script_name;<br>
> fastcgi_param QUERY_STRING $query_string;<br><br>- fastcgi_param QUERY_STRING $query_string;<br>+ fastcgi_param QUERY_STRING $request_uri;</blockquote><div><br>Так я уже пробовал, но тогда PHP не инициализирует хэши $_REQUEST и $_GET. Видимо, ему мешает распарсить "/index.php?" в начале строки, что вполне логично.<br>
</div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">> fastcgi_param REQUEST_URI $request_uri;<br>> fastcgi_param REQUEST_METHOD $request_method;<br>
> fastcgi_param CONTENT_TYPE $content_type;<br>> fastcgi_param CONTENT_LENGTH $content_length;<br>> fastcgi_param REMOTE_USER $remote_user;<br>> fastcgi_param REMOTE_ADDR $remote_addr;<br>
> fastcgi_param REMOTE_PORT $remote_port;<br>> }<br><br><br>--<br>Игорь Сысоев<br><a href="http://sysoev.ru">http://sysoev.ru</a><br><br></blockquote></div><br>