リバースプロキシ環境ではassetヘルパーが正しいパスを返してくれないことがあります。リバースプロキシ環境下でもassetヘルパー関数が正しいアドレスを返すようにする方法を紹介します。
リバースプロキシ下では正しいアドレスを返してくれない!
assetヘルパーはアセットへのフルパスを返してくれるヘルパー関数です。おもにbladeテンプレート内でjsやcssを読み込むのに使用されます。
しかし、リバースプロキシ下では、assetヘルパーが正しいアドレスを返してくれないことがあります。
たとえば、bladeでasset("/js/main.js")
としている状態でローカルサーバー(
)を立ち上げたときのことを考えてみましょう。http://localhost:8080
assetヘルパーはLaravelがホスティングされているURLを自動的に認識し、アセットへのフルパスを返してくれます。今回の例では
でホスティングされているため、assetヘルパーはhttp://localhost:8080
http://localhost:8080/js/main.js
と出力することになります。想定通りの挙動です。
しかし、これをそのままリバースプロキシで外部公開してしまったらどうでしょうか。
例えば、https://hogehoge.com
へホスティングしてしまうと、本来読み込まれるはずのjsのフルパスはhttps://hogehoge.com/js/main.js
となるはずです。しかし、ローカルサーバーで動作しているLaravelは、アクセスがリバースプロキシ経由であるかどうかは認識できませんので、ローカル環境同様、http://localhost:8080/js/main.js
を返してしまいます。結果、アセットが正しく読み込まれないという問題が起こってしまうのです。
.envにASSET_URLを追加して解決!
こういうときは.envファイルにASSET_URLを追加します。
.envにASSET_URLが設定されていると、assetヘルパーは設定されたURLをもとにアセットへのフルパスを返してくれるようになります。
ASSET_URL=https://hogehoge.com/fuga
{{asset("/js/main.js")}}
↓
https://hogehoge.com/fuga/js/main.jsと返すようになる
リバースプロキシで公開したいときは、ASSET_URLに公開するURLを指定しておきます。すると正しいフルパスが出力されるようになり、リバースプロキシ下でも正しくリソースが読み込まれるようになります。
まとめ
リバースプロキシ下でassetヘルパーが正しく動作しないときの解決法を紹介しました。
なお、サブディレクトリ公開やバーチャルホストでの公開時は、Laravelは自動的に公開されているURLを認識してくれますので、当記事での方法は不要です。リバースプロキシでローカルサーバーのLaravelを公開したいとき、ご参考にしていただければ幸いです。
コメント