diff --git a/src/Response.php b/src/Response.php index 953a8e52..e58da0f5 100644 --- a/src/Response.php +++ b/src/Response.php @@ -7,6 +7,7 @@ use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\App; +use Illuminate\Support\Str; use GuzzleHttp\Promise\PromiseInterface; use Illuminate\Support\Traits\Macroable; use Illuminate\Contracts\Support\Arrayable; @@ -99,7 +100,7 @@ public function toResponse($request) $page = [ 'component' => $this->component, 'props' => $props, - 'url' => $request->getBaseUrl().$request->getRequestUri(), + 'url' => Str::start(Str::after($request->fullUrl(), $request->getSchemeAndHttpHost()), '/'), 'version' => $this->version, ]; diff --git a/tests/ResponseTest.php b/tests/ResponseTest.php index f8035c51..b9e29cbb 100644 --- a/tests/ResponseTest.php +++ b/tests/ResponseTest.php @@ -361,4 +361,43 @@ public function test_responsable_with_invalid_key(): void $page['props']['resource'] ); } + + public function test_the_page_url_is_prefixed_with_the_proxy_prefix(): void + { + if (version_compare(app()->version(), '7', '<')) { + $this->markTestSkipped('This test requires Laravel 7 or higher.'); + } + + Request::setTrustedProxies(['1.2.3.4'], Request::HEADER_X_FORWARDED_PREFIX); + + $request = Request::create('/user/123', 'GET'); + $request->server->set('REMOTE_ADDR', '1.2.3.4'); + $request->headers->set('X_FORWARDED_PREFIX', '/sub/directory'); + + $user = ['name' => 'Jonathan']; + $response = new Response('User/Edit', ['user' => $user], 'app', '123'); + $response = $response->toResponse($request); + $view = $response->getOriginalContent(); + $page = $view->getData()['page']; + + $this->assertInstanceOf(BaseResponse::class, $response); + $this->assertInstanceOf(View::class, $view); + + $this->assertSame('/sub/directory/user/123', $page['url']); + } + + public function test_the_page_url_doesnt_double_up(): void + { + $request = Request::create('/subpath/product/123', 'GET', [], [], [], [ + 'SCRIPT_FILENAME' => '/project/public/index.php', + 'SCRIPT_NAME' => '/subpath/index.php', + ]); + $request->headers->add(['X-Inertia' => 'true']); + + $response = new Response('Product/Show', []); + $response = $response->toResponse($request); + $page = $response->getData(); + + $this->assertSame('/subpath/product/123', $page->url); + } }