これが私の状況です:
1)Nginxは80ポートと443ポートの両方をリッスンし、リクエストをMojoliciousアプリに転送します。
upstream ssltest {
server 127.0.0.1:9000;
}
server {
listen 80;
listen 443 ssl;
server_name ssltest.server.com;
location / {
proxy_pass http://ssltest/;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
2)Mojoliciousアプリに、次のコードを入力します。
get '/' => sub {
my $c = shift;
warn $c->url_for('/somepath')->to_abs; # HERE
$c->render(template => 'index');
};
ブラウザで使用しているプロトコルに応じて、またはをurl_for('/somepath')->to_abs
返します。しかし、それは常に戻りますhttps://ssltest.server.com/somepath
http://.../somepath
http
(相対パスではなく絶対パスを作成する必要がある理由がいくつかあります)
だから、私はウェブで検索しようとしました。
https://groups.google.com/d/msg/mojolicious/zL-c4Tx1vCk/_ihsLRsNAgAJ
このリンクは、カスタムヘッダーを介して現在のプロトコル(httpまたはhttps)をMojoアプリに渡すことができることを教えてくれましたX-Forward-Proto
。ただし、url_for()はまだhttp
。のみを返しました。
それから私はそのようなコードを試しました:
warn $c->url_for('/somepath')->to_abs->scheme(
$c->req->headers->header('X-Forwarded-Proto')
);
出来た!しかし今、私はurl_for->to_abs
コード内のすべての出現を変更する必要があります。
次に、私はこのリンクを見つけました:https://stackoverflow.com/a/27834805/1150133フックを使用して$c->req->url->base
自分自身を変更します。私はそれを適用しようとしました:
# change 'scheme' of request url
hook 'before_dispatch' => sub {
my $c = shift;
$c->req->url->base->scheme( $c->req->headers->header('X-Forwarded-Proto'));
};
get '/' => sub {
my $c = shift;
# url_for() seems to refer the request url to determine new url
warn $c->url_for('/somepath')->to_abs;
$c->render(template => 'index');
};
それは非常にうまくいきました。
これが正しい方法かどうかを知りたいと思います。発生する問題はありますか?私の目標を達成するためのより良いまたは最良の方法はありますか?
何かアドバイスをいただければ幸いです。
はい、それは良い方法ですが、私はそれをより柔軟にします。
まず、Perlには正しい方法はありません。MojoliciousもPerlです。それを行うには複数の方法があります。1つまたは複数の方法が他の方法よりも正しい場合があります。これはそのような場合です。
あなたのコードは問題なく、仕事を成し遂げます。ただし、アプリケーションを別の方法でデプロイすることにし、そのヘッダーが消えると、事態は好転します。したがって、少なくともその存在を確認する必要があります。
# change 'scheme' of request url
hook 'before_dispatch' => sub {
my $c = shift;
$c->req->url->base->scheme( $c->req->headers->header('X-Forwarded-Proto'))
if $c->req->headers->header('X-Forwarded-Proto');
};
これで、ローカルで実行しmorbo
、ヘッダーが設定されていない場合でも、動作するはずです(そもそも壊れたと仮定すると、検証しなかった合理的な仮定のように聞こえます)。
そのユニットテストの書き方については、この最近の質問を参照してください。それは別の側面から問題になりますが、正確に当てはまります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加