Edited at

LaravelのURLジェネレーターで.envに設定したホスト名を使用する。

More than 1 year has passed since last update.


LaravelのURLジェネレーター

以下の「/login」のようにURLジェネレーターの引数に相対パスのみ渡すとPHPの$_SERVERからホスト名を自動で作るのでセキュリティを考慮して内部に記述したホスト名を使うように設定する。


resources/views/auth/login.blade.php

<form class="form-horizontal" method="POST" action="{{ url('/login') }}">


URLジェネレーターの挙動


  • 強制ルートを指定しないと$_SERVERのサーバー情報から自動で取得する。

  • $forcedRootがnullだとリクエストのrootを使用。


vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php

public function formatRoot($scheme, $root = null)

{
if (is_null($root)) {
if (is_null($this->cachedRoot)) {
$this->cachedRoot = $this->forcedRoot ?: $this->request->root();
}
.....
}


  • リクエストではPHPの$_SERVERから取ってきてる。


vendor/symfony/http-foundation/Request.php

public function getHost()

{
if ($this->isFromTrustedProxy() && $host = $this->getTrustedValues(self::HEADER_CLIENT_HOST)) {
$host = $host[0];
} elseif (!$host = $this->headers->get('HOST')) {
if (!$host = $this->server->get('SERVER_NAME')) {
$host = $this->server->get('SERVER_ADDR', '');
}
}


サービスプロバイダーでホスト名を設定


  • .envにホスト名を記述

  • サービスプロバイダーでに強制的にURL指定


.env

APP_URL=http://example.com


app/Providers/AppServiceProvider.php

use URL;

use Config;

class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/

public function boot()
{
URL::forceRootUrl(Config::get('app.url'));// ルートURLを設定
}