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を設定
}