情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

【Nginx】add-header Set-Cookie +変数利用で落ちた原因メモ

Nginx (11)

Nginxの設定ファイルでadd-header Set-Cookieを使用して、クッキーにNginxの変数の中身を設定しようとしたところ、レスポンスが帰ってこなくなってしまいました。その時の原因をメモ。

記述したadd-header

こんな具合です。

add-header Set-Cookie "cookie_name=$nginx_var_name;Path=/;";

location / {}内にこの行を追加すると落ちてしまい、この行をコメントアウトすると正常に動作するため、この行の記述方法に問題があると思いました。つまり、設定の構文チェックにはひっかかっていません。

もともとMax-Ageの設定を指定していたことなど含め、最初はSet-Cookieの書き方が間違っているのかと思いました。しかし、ヘッダ名を変更しても同様でした。

変数参照が原因?

最終的に、変数部分を消して「cookie_name=;Path=/;」にすれば落ちないことが分かり、Set-Cookieで変数を参照する方法が間違っているのかとも思いましたが、これまた他のヘッダ名にしても同様だったことや、他のadd-headerでは普通に変数を参照できていることから、そもそも参照しようとしていた変数そのものに原因がありそうだと分かりました。

変数が壊れていた

その変数は、同時に書き足していた「map」で次のように設定していました。

map $cookie_template $template {
    default $template;
    template_name template_name;
}

これ自体では、ページが表示できなくなるような不具合は起こっていませんでした。

肝心の参照時におかしくなる、と。

最初は、アンダーバーが悪いのかハイフンが悪いのかとも思いましたが、よくよく思い出すと、設定する変数部分と、default値の両方で同じ変数を指定して大丈夫かな、と思いながら記述していたのですが、これがよくなかったようでした

解決策

というわけで、mapで設定する変数と、設定内容に含める変数を別にする(別途変数を用意する)ことで、解決できました

詳細は分かりませんが、mapの最初の変数指定は、変数の中身を展開せず、変数の名前自体を読み込んでいるので、それ以降map内で出現する同名変数の扱いが特殊になってしまうのかもしれません。一瞬しか使用しない変数が一つ増えてしまったのですが、対応していないのであれば仕方ありません。

コメント(0)

新しいコメントを投稿