NginxサブディレクトリでのLaravelリバースプロキシ設定とURL生成問題の解決策

最近、WeChat H5プロジェクトに取り組んでいます。ビジネス要件により、ドメインは同一である必要があり、PHPリクエストはNginxでリバースプロキシされています。通常はページ作成は不要ですが、時間が不足していたため、いくつかのページを組み込みました。

location /weixin/ {
            proxy_pass http://127.0.0.1:9000/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Remote_addr $remote_addr;
        }


        location /weixintest/ {
            proxy_pass http://127.0.0.1:9011/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Remote_addr $remote_addr;
        }

しかし、テスト時にリバースプロキシ経由のリクエストにより、JSやCSSなどの静的ファイルにアクセスできなくなる問題が発生しました。生成されたURLにはリバースプロキシのディレクトリ接頭辞が含まれていませんでした。

location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
    proxy_pass http://127.0.0.1:9011/;
    expires 12h;
}

当初、リバースプロキシ経由のJSとCSSファイルを別途設定しようと試みましたが、これで静的ファイルの問題は解決しました。

しかし、非同期リクエストのAPIに問題があることが判明し、リクエストを固定しようとしましたが、実装が複雑になりました。

最終的に、URL::toメソッドに接頭辞を設定できることがわかりました。

AppServiceProviderに以下の設定を追加しました:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\URL;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
//        Schema::defaultStringLength(191);
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //httpsまたはhttpの設定、テスト時はコメントアウト
        URL::forceScheme(env('APP_URL_HTTPS'));
        //url接頭辞の設定。nginxリバースプロキシ時に、生成されるファイルパスにサブディレクトリが含まれない問題を解決
        //ローカルテスト時はAPP_URLを空に、開発環境ではパスを含むURLを指定: https://www.example.com/weixintest/
        URL::forceRootUrl(env('APP_URL'));
    }
}

.envファイルに以下の設定を追加します:

ローカル開発環境<br></br><br></br>APP_URL=
#APP_URL_HTTPS=https
#APP_URL=https://www.example.com/weixintest/<br></br><br></br><br></br>テストまたは本番環境<br></br>

#APP_URL= APP_URL_HTTPS=https APP_URL=https://www.example.com/weixintest/

これにより、URL::toとURL::asset関連メソッドの問題が解決されます

最終的に、Nginxのリバースプロキシ設定を変更せず、設定ファイルの簡単な修正だけで問題を解決しました。また、開発環境と本番環境の両方に影響を与えず、比較的エレガントな解決策となりました。

タグ: nginx laravel リバースプロキシ URL生成 AppServiceProvider

6月23日 23:40 投稿