Re[2]: if нужен.

Михаил Монашёв postmaster at softsearch.ru
Wed Aug 15 19:01:14 UTC 2012


Здравствуйте, Валентин.

Ещё наткнулся на неочевидные грабли.

Есть конфиг

        # for genereting file name in Content-Disposition header
        map $request_filename $filename {
                default "";
                "~*(?<fn>[^/]+\.(?:gif|jpe?g|png))$"    $fn;
        }

        map $host $sitename {
                hostnames;
                default         "";

                *.site1.ru       "Site1.ru ";
                *.site2.ru       "Site2.ru ";

        }

        map $host $disposition {
                hostnames;
                default "";

                d.*     $foo;
        }

Есть локейшн, в котором потом используются $1 и $2 из его регэкспа:

                location ~* "^/([^/]+)/(.*)" {
                        proxy_pass              http://$1:80/$2;
                }

Если в него вставить строчки

set $foo 'attachment; filename="$sitename$filename"';
add_header Content-Disposition $disposition;

,  то  в  $1  и $2 заносится мусор из map-ов, которые используются для
расчёта переменных $foo, $sitename и $filename . Причём не важно, выше
или  ниже  proxy_pass  написать  эти  строчки.  Это  как  бы совсем не
очевидно  и  при  большом  конфиге  можно  долго искать причины такого
поведения.

По  хорошему  у  $1  и  $2  могла  бы  быть область видимости, хотя их
глобальность  тоже  чем-то  полезна.  Не  могу  придумать, как было бы
правильно,  но  сейчас как-то не очень правильно. В том же перле, если
$1 используется в одной функции, то мне не надо думать, что она затрёт
$1  в  вызвавшей функции или сама затрётся функцией, которую вызывает.

Городить  именованные переменные в регэкспах конечно можно, но всё это
костыли  какие-то  и  они  не  помогают,  ибо  $1  всёравно  почему-то
портится.

nginx/1.3.0


-- 
С уважением,
 Михаил                          mailto:postmaster at softsearch.ru



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