http://enable-cors.org/server_nginx.htmlの設定に基づいて、NGINX仮想ホスト定義にCORSを実装しようとしています。私が達成しようとしているのは、vhost定義に変数$ valid_cors_originを割り当ててから、次のようにすべてのCORS検証を処理する別のファイルを含めることです。
location / {
...
$valid_cors_origin = "foobar";
include cors_handling;
}
私は取り除かきながらlocation
enable-cors.orgからの例から環境を。この設定では、以下が機能しcors_handling
ます。
if ($http_origin = "${valid_cors_origin}"){
set $cors "true";
}
Origin: foobar
もちろん、リクエストにヘッダーを追加する限り。
enable-cors.orgの例では、正規表現を使用して$http_origin
。と照合しています。同じことができるようにしたいので、変数に正規表現を割り当てる必要があります$valid_cors_origin
。問題は、変数がifステートメントで評価されていないように見えることです。これまでのところ、運が悪かったので、次のことを試しました。
$valid_cors_origin = "/(foo|bar)/";
if ($http_origin *~ $valid_cors_origin){
set $cors "true";
}
私を残します
[notice] 43797#0: *1 $valid_cors_origin does not match "foobar"
文字列評価を強制しようとしています:
if ($http_origin *~ "${valid_cors_origin}"){
set $cors "true";
}
[notice] 43797#0: *1 "${valid_cors_origin}" does not match "foobar"
そして、私$valid_cors_origin
がただに置き換えた他のいくつかのバリエーション/foo/
ですが、それは評価されていないようですので、私が何に割り当てても問題ないと思います$valid_cors_origin
。
これはNGINXでも可能ですか、および/またはこの問題を解決する他のモジュール式の方法はありますか?基本的な要件:vhostファイルから有効なオリジンを完全に管理し、構成cors_handling
を可能な限り一般的に保つことができるようにしたい。
更新:私はついに@cnstによって提案されたソリューションをテストする時間ができました、そしてそれはうまくいきます。完全を期すために、ファイルcors_handlingから$ http_originのチェックを削除し、チェックをvhost自体に移動しました。ここで次のことができます。
if ($http_origin ~* (regex|for|my|httporigin)) {
set $cors "true";
}
include cors_handling;
比較する必要のある中間変数が必要なのはなぜ$http_origin
ですか?
代わりに、実行中にif
ディレクティブを直接使用し、必要に応じて、ディレクティブ全体を別のファイルinclude
に配置してから、$http_origin
評価する場所の代わりに配置することもできます。
または、全体がcors_handling
すでに別のファイルにある場合は、見出しをif
(と比較して$http_origin
)実際のlocation
(または全体server
)に戻します。
あなたは明らかにあなたがやろうとしていることをあなたがやろうとしているのと同じ方法でやることはできませんが、これらの選択肢はかなり十分で合理的であるように思われます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加