Re: Это баг или фича? и как это можно победить без использовани if ?

Дмитрий Андреев itskemko на gmail.com
Чт Дек 24 23:24:38 MSK 2009


Мне крайне лень ставить apache у себя для того чтобы проверить
изложенное ниже и утверждать с 100% уверенностью, а не 85%, так что в
крайнем случае, если ляпнул глупость, попрошу остальных участников
рассылки меня поправить.


Вообще-то RFC сейчас у вас как раз-таки Апач нарушает, а не nginx. Ну
или, что маловероятно, сам php-скрипт, но как-то изберательно:
коверкает request_uri при запросах от апача, а от nginx'а оставляет
нетронутыми. Причем судя по
http://example.com.customers.tigertech.net/phpinfo.php и
https://cgi.ccs.neu.edu/home/cgiadmin/examples/phpinfo.php (первая
страница выдачи гугла по запросу "apache phpinfo example"),
изначально, впрочем кто бы сомневался, его поведение ничуть не
отличается от поведения nginx'а в этом вопросе. Простой вопрос на
логику: если в RFC четко прописано "5.1 Request-Line

The Request-Line begins with a method token, followed by the
Request-URI and the protocol version, and ending with CRLF. The
elements are separated by SP characters. No CR or LF is allowed except
in the final CRLF sequence.

        Request-Line   = Method SP Request-URI SP HTTP-Version CRLF",
что по-вашему делать браузеру, если вы обращаетесь на
http://domain.tdl/, поле Request-URI в запросе как бы никто вдруг
необязательным не сделал. Потому / в начале есть всегда. Ну и
совершенно не вижу смысла серверу брать и менять на свое усмотрение.


24 декабря 2009 г. 21:58 пользователь <maxhl на hitline.net.ua> написал:
>
> Вечер добрый. Спрашиваю еще раз потому чо в первый раз сообщения видимо
> недошли.
> Есть набор правил .htaccess:
> ____________________________________________________________________________
> RewriteCond %{QUERY_STRING} (.*)
> RewriteCond %{REQUEST_FILENAME} !-f
> RewriteCond %{REQUEST_FILENAME} !-d
> RewriteRule ^(.*)$ index.php?permalink=$1&query_str=%1 [L,QSA]
>
> #feed
> RewriteRule ^feed/rss/$ _cache/rss_main.xml [L,QSA]
>
> #sitemap
> RewriteRule ^sitemap/$ index.php?page=sitemap [L,QSA]
> RewriteRule ^sitemap/([0-9]+)/$ index.php?page=sitemap&spage=$1 [L,QSA]
>
> #contact form
> RewriteRule ^contact/$ index.php?page=contact_form [L,QSA]
> ____________________________________________________________________________
> Примеры из руководства неработают.
> Сделал так:
> server {
>    listen 80;
>    server_name test.info;
>    access_log /home/logs/t_access.log combined;
>    error_log /home/logs/t_error.log debug;
>    server_name_in_redirect off;
>    root /home/test;
>    index index.php index.pl index.cgi index.html index.htm;
>
>    location / {
>        try_files      $uri  $uri/  @nedrupal;
>    }
>
>    location ~ \.php$ {
>        try_files      $uri  @nedrupal;
>        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
>        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
>        fastcgi_param PATH_INFO $fastcgi_script_name;
>        fastcgi_pass unix:/mnt/md0/php-fcgi.sock;
>        fastcgi_pass_request_body off;
>        client_body_in_file_only clean;
>        fastcgi_param   REQUEST_BODY_FILE  $request_body_file;
>        fastcgi_param   CONTENT_TYPE    $content_type;
>        fastcgi_param   CONTENT_LENGTH  $content_length;
>        fastcgi_param   DOCUMENT_ROOT   $document_root;
>        fastcgi_param   DOCUMENT_URI    $document_uri;
>        fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
>        fastcgi_param   QUERY_STRING    $args;
>        fastcgi_param   REMOTE_ADDR             $remote_addr;
>        fastcgi_param   REMOTE_PORT             $remote_port;
>        fastcgi_param   REQUEST_URI             $request_uri;
>        fastcgi_param   REQUEST_METHOD  $request_method;
>        fastcgi_param   SERVER_ADDR             $server_addr;
>        fastcgi_param   SERVER_NAME             $server_name;
>        fastcgi_param   SERVER_PORT             $server_port;
>        fastcgi_param   SERVER_PROTOCOL $server_protocol;
>        fastcgi_param   SERVER_SOFTWARE nginx/$nginx_version;
>        fastcgi_param   REDIRECT_STATUS 200;
>        fastcgi_index   index.php;
>    }
>
>    location @nedrupal {
>        fastcgi_param SCRIPT_FILENAME  /home/person51/index.php;
>        fastcgi_param SCRIPT_NAME /index.php;
>        fastcgi_param PATH_INFO /index.php;
>        fastcgi_pass unix:/mnt/md0/php-fcgi.sock;
>        fastcgi_pass_request_body off;
>        client_body_in_file_only clean;
>        fastcgi_param   REQUEST_BODY_FILE               $request_body_file;
>        fastcgi_param   CONTENT_TYPE            $content_type;
>        fastcgi_param   CONTENT_LENGTH          $content_length;
>        fastcgi_param   DOCUMENT_ROOT           $document_root;
>        fastcgi_param   DOCUMENT_URI            $document_uri;
>        fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
>        fastcgi_param   QUERY_STRING    permalink=$uri&query_str=$args;
>        fastcgi_param   REMOTE_ADDR                     $remote_addr;
>        fastcgi_param   REMOTE_PORT                     $remote_port;
>        fastcgi_param   REQUEST_URI                     $request_uri;
>        fastcgi_param   REQUEST_METHOD          $request_method;
>        fastcgi_param   SERVER_ADDR                     $server_addr;
>        fastcgi_param   SERVER_NAME                     $server_name;
>        fastcgi_param   SERVER_PORT                     $server_port;
>        fastcgi_param   SERVER_PROTOCOL         $server_protocol;
>        fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;
>        fastcgi_param   REDIRECT_STATUS 200;
>        fastcgi_index   index.php;
>    }
>
> В результате добился :
>
> $_SERVER["QUERY_STRING"]=permalink=/video-1/Smotret-Kino-Besplatno-7/&query_
> str=
> $_SERVER["REQUEST_URI"]=/video-1/Smotret-Kino-Besplatno-7/
> $_SERVER["SCRIPT_NAME"]=/index.php
>
> Для сравнения в апаче :
>
> $_SERVER["QUERY_STRING"]=permalink=video-1/Smotret-Kino-Besplatno-7/&query_s
> tr=
> $_SERVER["REQUEST_URI"]=/video-1/Smotret-Kino-Besplatno-7/
> $_SERVER["SCRIPT_NAME"]=/index.php
>
> Почему в nginx $uri содержит самый первый символ слеш а в апаче нет? Для
> скриптов скомпиленных ioncube это оказалось смертельно ...
> Как сделать так чтоб его небыло ?
>
>
> ____________________________
> С уважением Max ICQ 71006063
>
>
> _______________________________________________
> nginx-ru mailing list
> nginx-ru на nginx.org
> http://nginx.org/mailman/listinfo/nginx-ru


Подробная информация о списке рассылки nginx-ru