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