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