web-dev-qa-db-ja.com

Laravelリバースプロキシの背後にあるルート

では、開発目的のために、専用のWebサーバーを用意しました。現在インターネットに直接接続されていないため、別のサーバーにApacheリバースプロキシをセットアップし、開発サーバーに転送しています。

このようにして、サーバーへのWebアクセスを取得できます。

問題は、Laravel内のルートに、内部サーバーのIPアドレスまたはサーバーのコンピューター名がプレフィックスとして追加されていることです。

たとえば、 http://subdomain.test.com にアクセスしますが、route()ヘルパーを使用して生成されたすべてのルートに次のURLが表示されます:http://10.47.32.22http://subdomain.test.comではありません。

リバースプロキシは次のように設定されます。

<VirtualHost *:80>
    ServerName igateway.somedomain.com

    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyPass / http://10.47.32.22:80/
    ProxyPassReverse / http://10.47.32.22:80/
    <Location />
        Order allow,deny
        Allow from all
    </Location>
</VirtualHost>

実際のドメイン名をconfig\app.phpに設定しました。

質問

ルーティングで使用するデフォルトのURLを設定するにはどうすればよいですか?内部アドレスを使用したくないので、リバースプロキシのポイントを無効にします。

すべてのルートをRoute::group(['domain' ...グループに含めようとしましたが、どちらも機能しません。

12
Phil Cross

Laravel 5アプリケーションがSSLロードバランサーの背後にあることを認識していなかったとき、私は同じ(または同様の問題)に遭遇しました。

次のデザインがあります。

  • クライアントはHTTPS経由でSSLロードバランサーと通信します
  • SSLロードバランサーがHTTP経由でバックエンドサーバーと通信する

ただし、これにより、HTMLコード内のすべてのURLがhttp://スキーマで生成されます。

以下は、スキーマ(httpとhttps)を含め、これを機能させるための簡単な方法です。

app/Http/routes.phpの上に次のコードを配置します

$proxy_url    = getenv('PROXY_URL');
$proxy_schema = getenv('PROXY_SCHEMA');

if (!empty($proxy_url)) {
   URL::forceRootUrl($proxy_url);
}

if (!empty($proxy_schema)) {
   URL::forceSchema($proxy_schema);
}

次に、次の行を。envファイルに追加します。

PROXY_URL = http://igateway.somedomain.com

生成されたHTMLコードのスキーマもhttp://からhttps://に変更する必要がある場合は、次の行も追加します。

PROXY_SCHEMA = https

最新バージョンのlaravel forceSchemaメソッド名はforceSchemeに変更され、上記のコードは次のようになります。

if (!empty($proxy_schema)) {
    URL::forceScheme($proxy_schema);
}
17
TimeLord

わかった、わかった。うまくいけば、これは将来誰かを助けるでしょう。

Laravelはhttpリクエストのconfig\app.phpファイルのurlプロパティを無視しているように見えます(職人専用であることを示しています)代わりに、Apacheが提供するHTTP_HostまたはSERVER_NAMEを使用していますURLのドメインを生成します。

このデフォルトのURLを上書きするには、routes.phpファイルに移動し、次のメソッドを使用します。

URL::forceRootUrl('http://subdomain.newurl.com');

これにより、URLジェネレーターは、HTTP_HostまたはSERVER_NAME値の代わりに新しいURLを使用するようになります。

5
Phil Cross

Laravelにはもっと便利な解決策があるようです。そこで答えを確認してください: ロードバランサの背後でLaravel 5を使用してSSLを構成するにはどうすればよいですか(SSL終了) ?

1
Alex

このトピックは古いものであることはわかっていますが、DatabaseSessionHandler.pdf [@ Illuminate/Session]の次の行を置き換えることでこの問題を解決しています。

    protected function ipAddress()
    {
        return $_SERVER['HTTP_X_FORWARDED_FOR'];
//        return $this->container->make('request')->ip();
    }

もちろん、最初にセッションテーブルを移行して構成を設定する必要があります
(。env変数SESSION_DRIVER =データベース)

0
Fabus

@TimeLordのソリューションのフォローアップ:

laravelの最新バージョンでは、強制スキーマの名前が変更され、現在はURL::forceScheme()です。