From: Carl Worth Date: Wed, 27 May 2020 03:43:58 +0000 (-0700) Subject: Ensure path ending with game ID always has a trailing slash X-Git-Url: https://git.cworth.org/git?p=empires-server;a=commitdiff_plain;h=c60da21a61ee8b98550618aa197aefb3cf69a725 Ensure path ending with game ID always has a trailing slash The trailing slash is essential here so that when JavaScript code executing in the user agent accesses a relative resource, it is a child of the game ID rather than a peer. That is, from https://lmno.games/empires/WLWV/ a reference to the "players" resource is https://lmno.games/empires/WLVW/players (But if we started with https://lmno.games/empires/WLWV we would end up referencing https://lmno.games/empires/players which will not work.) Here, we were already doing a redirect in the case of needing to canonize the game ID, so we simply need to also do that redirect even if the game ID was already canonical but the trailing slash was missing. --- diff --git a/lmno.js b/lmno.js index abb1f20..8a3210e 100644 --- a/lmno.js +++ b/lmno.js @@ -142,10 +142,16 @@ app.use('/:engine([^/]+)/:game_id([a-zA-Z0-9]{4})', (request, response, next) => const game_id = request.params.game_id; const canon_id = lmno_canonize(game_id); - /* Redirect user to page with the canonical ID in it. */ - if (game_id !== canon_id) { - const new_url = request.originalUrl.replace(`/${engine}/${game_id}`, - `/${engine}/${canon_id}`); + /* Redirect user to page with the canonical ID in it, also ensuring + * that the game ID is _always_ followed by a slash. */ + const has_slash = new RegExp(`^/${engine}/${game_id}/`); + if (game_id !== canon_id || + ! has_slash.test(request.originalUrl)) + { + const old_path = new RegExp(`/${engine}/${game_id}/?`); + const new_path = `/${engine}/${canon_id}/`; + const new_url = request.originalUrl.replace(old_path, new_path); + console.log("Redirecting from " + request.originalUrl + " to " + new_url); response.redirect(301, new_url); return; }