I am setting endpoints for my web application like this:
JavaScript
x
$router = new LeagueRouteRouteCollection;
function user_action (Request $request, Response $response) {
// some logic
.
.
.
return $response;
}
$router->addRoute('GET', '/user', 'user_action');
/user endpoint works well.
However when I use /user/ (extra slash in the end) I get a
LeagueRouteHttpExceptionNotFoundException
I want both endpoints to point to same function. I can achieve the desired behavior by adding routes for both endpoints separately:
JavaScript
$router->addRoute('GET', '/user', 'user_action');
$router->addRoute('GET', '/user/', 'user_action');
What is the recommended way to resolve this?
Advertisement
Answer
There are two options
- You can use htaccess to strip the trailing slash from the url.
- Send the dispatcher the url without the trailing slash.
Solution 1: htaccess
Add the following rewrite rule to your .htacces:
JavaScript
RewriteRule ^(.*)/$ /$1 [L,R=301]
Solution 2: dispatcher
After you’ve created the router from a RouteCollection, you get the dispatcher and dispatch the routes:
JavaScript
$router = new RouteCollection();
$dispatcher = $router->getDispatcher();
$response = $dispatcher->dispatch($request->getMethod(), $request->getPathInfo());
The url which is send to the dispatcher can easily be adjusted:
JavaScript
$url = $request->getPathInfo();
// if url ends with a slash, remove it
$url = rtrim($url, '/');
$response = $dispatcher->dispatch($request->getMethod(), $url);
Two easy solutions, which one you use depends on you.