PATH_INFO, PATH_TRANSLATED, SCRIPT_FILENAME для FPM

grigori

( ͡° ͜ʖ ͡°)
Команда форума
я тут пытаюсь написать дефолтный конфиг nginx для yii, и пытаюсь понять, нужен ли PATH_INFO?

Нашел старый пост фиксера http://forum.nginx.org/read.php?25,31937 про PATH_INFO и PATH_TRANSLATED
Как я понял, на эту тему забили - наверное, всех устраивает копирование строки
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
?

Да, все работает указанием SCRIPT_FILENAME.

Я правильно понимаю, что по RFC надо определять PATH_INFO и PATH_TRANSLATED, хотя они и не используются ни в PHP-FPM, ни в приложениях?

nginx предлагает http://sysoev.ru/nginx/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info и
регулярку ^(.+\.php)(.*)$, которая ставит в PATH_INFO все, что идет вслед за .php до query_string
 

fixxxer

К.О.
Партнер клуба
в моем багрепорте щас (и года не прошло... а, нет, прошел!) идет активное обсуждение

в соответствии с протоколом, вообще достаточно document_root и script_name. Вот к этому и есть желание все свести.

пока что надо ставить SCRIPT_FILENAME и cgi.fix_pathinfo=0 (почему так? посмотрите strace-ом число stat()ов на каждый реквест при =1, офигейте и ставьте всегда 0)
 

fixxxer

К.О.
Партнер клуба
nginx предлагает http://sysoev.ru/nginx/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info и
регулярку ^(.+\.php)(.*)$, которая ставит в PATH_INFO все, что идет вслед за .php до query_string
это нужно только для извращений вида /index.php/my/cool/pseudo/чпу

ноги у этого растут из двух мест

1) cgi 90х + seo, когда поисковики любили игнорировать query-string - грубо говоря был некий /index.cgi в виде бинаря, и хотелось вызывать вида /index.cgi/some/params - вот и придумали path_info

2) апач1 с mod_php, в котором по каким-то причинам так сложилось, что ссылки вида /index.php/foo/bar таки вызывали index.php (правда тут не path_info, но обычно добавляли на него проверку на случай как раз cgi). А реврайты - дык тогда хтаксесс то редко давали.

Ну то есть понимаете когда это было актуально :D
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
думаю, за свою долгую нелегкую жизнь автор yii к адресам вида /index.php/controller/action так привык, что ставить вопрос о целесообразности невозможно, несмотря на всю логичность и очевидность

ну, собсно, написал так
 

fixxxer

К.О.
Партнер клуба
Ага ага.

Кстати на этом примере очень легко показать как будет работает cgi.fix_pathinfo = 1 (ну он в т.ч. и для подобного задумывался; с CGI и его exec()ами на каждый реквест это казалось мелочью).

Примерно вот так (код конечно другой но смысл ясен)
PHP:
$request_filename = '/index.php/my/cool/pseudo/чпу';

$path = $request_filename;
while ($path != '/' && !file_exists($DOCUMENT_ROOT . $path)) {
    $path = dirname($path);
}

if ($path == '/') error();

$PATH_TRANSLATED = $DOCUMENT_ROOT . $path;
$PATH_INFO = substr($request_filename, strlen($path));
Ну это я упрощенно сильно конечно. Там такая портянка эммм кода что я толком не разобрался что зачем =)
 

MiksIr

miksir@home:~$
У меня, правда, конфиг немного другой... твой не очень нравится, если честно - слишком он универсальный. Я просто заворачиваю все из / в fpm и прописываю исключения по директориям, что заворачивать не нужно.
Как минимум советовал бы добавить
location ~ ^/(favicon.ico|robots.txt)$ {
try_files $uri =404;
}
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
MiksIr ты уж извини, но твои слова в этой теме - оффтоп и глупость, просто перечитай внимательно мои сообщения и мой конфиг
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
тут выяснилось, что cgi.fix_pathinfo=1 не только вредно, но при дефолтном конфиге nginx может быть очень опасно

Если у вас на сервере есть аплоад картинок, то запрос к /upload/image.jpg/foo.php nginx с дефолтным конфигом отправит на обработку в php, а со включеным fix_pathinfo php пойдет по пути вверх, найдет image.jpg и выполнит его.
Вот так-то.

https://nealpoole.com/blog/2011/04/setting-up-php-fastcgi-and-nginx-dont-trust-the-tutorials-check-your-configuration/
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
надо как минимум ставить в location ~ \.php { try_files $uri =404; , который вернет 404, если php-файла а самом деле нет.
в случае фреймворка я перекидываю на бутстрап
 

fixxxer

К.О.
Партнер клуба
эээ, try_files же его статикой отдаст

можно через if -f, но отключения fix_pathinfo вообще достаточно

а вообще, в сторону, какие-то у вас там странные фреймворки. у меня в 99.9% случев всего два location-а - php bootstrap и статика, весь php-код лежит вообще вне doc root, script_filename etc строю из кастомных переменных $application_root и $application_script_name. Дополнительные location-ы появляются только для вариаций на тему access key и/или X-Accel-Redirect.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
эээ, try_files же его статикой отдаст
та не, не статикой, нормально обрабатывает
я имею ввиду конструкцию
Код:
    location ~ \.php {
        try_files $document_root$fastcgi_script_name =404;
        fastcgi_pass   127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   }
так можно прикрыть дырку, создаваемую fix_pathinfo, и получить внятный 404 (а не белую страницу), и не дергать php вообще
конечно, fix_pathinfo надо выключить в любом случае

а вообще, в сторону, какие-то у вас там странные фреймворки. у меня в 99.9% случев всего два location-а - php bootstrap и статика, весь php-код лежит вообще вне doc root, script_filename etc строю из кастомных переменных $application_root и $application_script_name. Дополнительные location-ы появляются только для вариаций на тему access key и/или X-Accel-Redirect.
это ж универсальный конфиг на большинство случаев жизни для мануала :)
по дефолту приложение лежит в htdocs/protected/ - пишу соответственно
нужна возможность рядом с приложением на фреймворке поставить другой пакет, например, форум или wiki, значит, вообще все вызовы на бутстрап замыкать не надо, + возможность указать bootstrap,
а в жизни, конечно, приложение выносится из htdocs, bootstrap переименовывать не надо и все сводится к 2м location
 

fixxxer

К.О.
Партнер клуба
А, так да. Совсем забыл про важность контекста location-а для try_files.

Универсальные конфиги нафиг не нужны, по-моему. Про шаред хостинги давно пора забыть, да и какое к ним отношение имеют конфиги nginx-a? =)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
кому не нужен универсальный - тому образец вообще не нужен :)
 
Сверху