Skip to content

Commit d9829d7

Browse files
committed
Improve URL handling with support for trailing slashes
1 parent f1321d4 commit d9829d7

File tree

2 files changed

+86
-1
lines changed

2 files changed

+86
-1
lines changed

src/Response.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public function toResponse($request)
109109
[
110110
'component' => $this->component,
111111
'props' => $props,
112-
'url' => Str::start(Str::after($request->fullUrl(), $request->getSchemeAndHttpHost()), '/'),
112+
'url' => $this->getRequestUrl($request),
113113
'version' => $this->version,
114114
'clearHistory' => $this->clearHistory,
115115
'encryptHistory' => $this->encryptHistory,
@@ -359,4 +359,21 @@ public function isPartial(Request $request): bool
359359
{
360360
return $request->header(Header::PARTIAL_COMPONENT) === $this->component;
361361
}
362+
363+
/**
364+
* Get the request URL with proper handling of proxy prefixes and trailing slashes.
365+
*/
366+
protected function getRequestUrl(Request $request): string
367+
{
368+
$uri = $request->getRequestUri();
369+
370+
// Handle X-Forwarded-Prefix header for proxy setups
371+
if ($prefix = $request->header('X_FORWARDED_PREFIX')) {
372+
if (!str_starts_with($uri, $prefix)) {
373+
$uri = $prefix . $uri;
374+
}
375+
}
376+
377+
return $uri;
378+
}
362379
}

tests/ResponseTest.php

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -827,4 +827,72 @@ public function test_the_page_url_doesnt_double_up(): void
827827

828828
$this->assertSame('/subpath/product/123', $page->url);
829829
}
830+
831+
public function test_trailing_slashes_in_url_are_preserved(): void
832+
{
833+
// Test with trailing slash in the URL
834+
$request = Request::create('/categories/', 'GET');
835+
$request->headers->add(['X-Inertia' => 'true']);
836+
837+
$response = new Response('Category/Index', []);
838+
$response = $response->toResponse($request);
839+
$page = $response->getData();
840+
841+
$this->assertSame('/categories/', $page->url);
842+
843+
// Test with trailing slash and query parameters
844+
$request = Request::create('/categories/?page=1&sort=name', 'GET');
845+
$request->headers->add(['X-Inertia' => 'true']);
846+
847+
$response = new Response('Category/Index', []);
848+
$response = $response->toResponse($request);
849+
$page = $response->getData();
850+
851+
$this->assertSame('/categories/?page=1&sort=name', $page->url);
852+
853+
// Test with trailing slash and proxy prefix
854+
$request = Request::create('/categories/', 'GET');
855+
$request->headers->set('X_FORWARDED_PREFIX', '/admin');
856+
$request->headers->add(['X-Inertia' => 'true']);
857+
858+
$response = new Response('Category/Index', []);
859+
$response = $response->toResponse($request);
860+
$page = $response->getData();
861+
862+
$this->assertSame('/admin/categories/', $page->url);
863+
}
864+
865+
public function test_non_trailing_slashes_in_url_work_correctly(): void
866+
{
867+
// Test with non-trailing slash in the URL
868+
$request = Request::create('/categories', 'GET');
869+
$request->headers->add(['X-Inertia' => 'true']);
870+
871+
$response = new Response('Category/Index', []);
872+
$response = $response->toResponse($request);
873+
$page = $response->getData();
874+
875+
$this->assertSame('/categories', $page->url);
876+
877+
// Test with non-trailing slash and query parameters
878+
$request = Request::create('/categories?page=1&sort=name', 'GET');
879+
$request->headers->add(['X-Inertia' => 'true']);
880+
881+
$response = new Response('Category/Index', []);
882+
$response = $response->toResponse($request);
883+
$page = $response->getData();
884+
885+
$this->assertSame('/categories?page=1&sort=name', $page->url);
886+
887+
// Test with non-trailing slash and proxy prefix
888+
$request = Request::create('/categories', 'GET');
889+
$request->headers->set('X_FORWARDED_PREFIX', '/admin');
890+
$request->headers->add(['X-Inertia' => 'true']);
891+
892+
$response = new Response('Category/Index', []);
893+
$response = $response->toResponse($request);
894+
$page = $response->getData();
895+
896+
$this->assertSame('/admin/categories', $page->url);
897+
}
830898
}

0 commit comments

Comments
 (0)