Re: Наследование fastcgi_param
Maxim Dounin
mdounin at mdounin.ru
Sat Jul 4 07:33:59 UTC 2015
Hello!
On Wed, Jun 24, 2015 at 08:58:42PM +0300, Gena Makhomed wrote:
> On 24.06.2015 19:57, Валентин Бартенев wrote:
>
> >>> location /info {
> >>> fastcgi_param SCRIPT_FILENAME /www/info.php;
> >>> include fastcgi_params;
> >>> fastcgi_pass 127.0.0.1:9000 <http://127.0.0.1:9000>;
> >>> }
>
> >>чтобы полное счастье наступило, лучше делать всегда так,
> >>что include fastcgi_params; будет первой строкой
> >>в блоке, fastcgi_pass - последней, а между ними -
> >>директивы fastcgi_param.
>
> >Это не поможет. Разве что только некоторые реализации FastCGI
> >берут только последнее значение параметра, но передаваться всегда
> >будут оба. И нет никак гарантий, как это будет обработано.
>
> По крайней мере, php-fpm обрабатывает только последний параметр,
> как и ожидалось, и вряд ли это уже изменится в новых версиях PHP.
Just FYI, это зависит от версии PHP. До 5.3, если не ошибаюсь,
порядок был обратный.
> А зачем такое странное поведение fastcgi_param было реализовано?
> - https://en.wikipedia.org/wiki/Principle_of_least_astonishment
>
> Например, "аналогичная" по своей сути директива proxy_set_header
> переопределяет существующее значение, а не добавляет еще один header.
Это не так. Если задать две директивы proxy_set_header с одним и
тем же заголовком, то оба заголовка отправятся на бекенд. Но, в
отличии от FastCGI, протокол HTTP однозначно специфицирует, что с
этим делать.
Единственный нюанс состоит в том, что при использовании
proxy_set_header из исходного запроса удаляются заголовки,
одноимённые добавляемому. Это сделано в первую очередь для того,
можно было изменять исходный запрос. В случае fastcgi аналогично
обрабатываются HTTP_* параметры.
> Тем более, что в протоколе CGI, на котором основан протокол FastCGI
> эти параметры передаются скрипту в виде переменных окружения,
> и там даже теоретически невозможно сделать несколько значений
> всегда будет использовано только последнее значение параметра.
Ну вот как раз проблема в том, что в протоколе FastCGI возможность
отправить два одинаковых параметра добавилась, а что с этим потом
делать - спецификация не описывает.
> Очень странная это feature, она больше похожа на bug
> Есть ли шансы, что этот bug будет исправлен в nginx?
Поведение nginx'а сейчас: послать на бекенд ровно то, что
администратор написал в конфиге, и оно консистентно для всех
соответствующих модулей (proxy, fastcgi, scgi, uwsgi). Менять это
поведение не планируется.
--
Maxim Dounin
http://nginx.org/
Подробная информация о списке рассылки nginx-ru