01.02.08, <b class="gmail_sendername">Igor Sysoev</b> &lt;<a href="mailto:is@rambler-co.ru">is@rambler-co.ru</a>&gt; написал(а):<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>&gt; Добрый день. Есть nginx 0.5.26, под ним через FastCGI бегает PHP (Drupal).<br>&gt; Проблема, наверное, известная, и подобный вопрос не раз задавался, но<br>
&gt; решения я так и не нашел.<br>&gt;<br>&gt; Вообщем, пользователь вводит в форму поиска строку, например, &quot;пластиковые<br>&gt; окна&quot;. Браузер отправляет запрос:<br>&gt; GET /search/node/пластиковые+окна HTTP/1.1<br>
&gt;<br>&gt; Этот запрос через реврайт преобразуется в следующий:<br>&gt; GET /index.php?q=search/node/пластиковые+окна HTTP/1.1<br>&gt;<br>&gt; Однако, FactCGI-серверу query string передается заэскейпенный (%2B вместо<br>
&gt; +):<br>&gt; GET /index.php?q=search/node/пластиковые%2Bокна HTTP/1.1<br>&gt;<br>&gt; Таким образом, &quot;пластиковые окна&quot; превращаются в &quot;пластиковые+окна&quot;.<br><br>И это правильно.</blockquote><div><br>
Видимо, да. Я считал, что проблема в query string, т.к. под Apache/mod_php все работает правильно, а под nginx/fastcgi появляется вышеописаная проблема. Однако я сравнил вывод phpinfo() (глобальные переменные $_GET, $_REQUEST и $_SERVER) под этими двумя серверами, и они оказались идентичными. Так что, если я нигде не ошибся, то причину нужно искать не в веб-сервере, а в кишках Drupal. Хотя я даже представить не могу, в чем именно она заключается. Пока сделал так:<br>
<br>if (strpos($_SERVER[&#39;SERVER_SOFTWARE&#39;], &#39;nginx&#39;) !== false) {<br>
&nbsp; $_GET[&quot;q&quot;] = urldecode($_GET[&quot;q&quot;]);<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;">&gt; Вопрос: как получить незаэскейпенную $query_string в конфиге и передать ее<br>
&gt; FastCGI? Или как по-другому решить эту проблему?<br>&gt;<br>&gt; Куски конфига:<br>&gt;<br>&gt; # Реврайтинг<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;if (!-e $request_filename) {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rewrite ^/(.*)$ /index.php?q=$1 last;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&gt;<br>&gt; # PHP<br>&gt;&nbsp;&nbsp; location ~ .php$ {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_pass&nbsp;&nbsp; <a href="http://127.0.0.1:8888">127.0.0.1:8888</a>;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_index&nbsp;&nbsp;index.php;<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param&nbsp;&nbsp;SCRIPT_FILENAME&nbsp;&nbsp;/var/www/xxxxxxxxx$fastcgi_script_name;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param&nbsp;&nbsp;QUERY_STRING&nbsp;&nbsp;&nbsp;&nbsp; $query_string;<br><br>-&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param&nbsp;&nbsp;QUERY_STRING&nbsp;&nbsp;&nbsp;&nbsp; $query_string;<br>+&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param&nbsp;&nbsp;QUERY_STRING&nbsp;&nbsp;&nbsp;&nbsp; $request_uri;</blockquote><div><br>Так я уже пробовал, но тогда PHP не инициализирует хэши $_REQUEST и $_GET. Видимо, ему мешает распарсить &quot;/index.php?&quot; в начале строки, что вполне логично.<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;">&gt;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param&nbsp;&nbsp;REQUEST_URI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$request_uri;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param&nbsp;&nbsp;REQUEST_METHOD&nbsp;&nbsp; $request_method;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param&nbsp;&nbsp;CONTENT_TYPE&nbsp;&nbsp;&nbsp;&nbsp; $content_type;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param&nbsp;&nbsp;CONTENT_LENGTH&nbsp;&nbsp; $content_length;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param&nbsp;&nbsp;REMOTE_USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$remote_user;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param&nbsp;&nbsp;REMOTE_ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$remote_addr;<br>
&gt;&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_param&nbsp;&nbsp;REMOTE_PORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$remote_port;<br>&gt;&nbsp;&nbsp; }<br><br><br>--<br>Игорь Сысоев<br><a href="http://sysoev.ru">http://sysoev.ru</a><br><br></blockquote></div><br>