]> git.cworth.org Git - empires-server/commitdiff
Ensure path ending with game ID always has a trailing slash
authorCarl Worth <cworth@cworth.org>
Wed, 27 May 2020 03:43:58 +0000 (20:43 -0700)
committerCarl Worth <cworth@cworth.org>
Wed, 27 May 2020 03:43:58 +0000 (20:43 -0700)
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.

lmno.js

diff --git a/lmno.js b/lmno.js
index abb1f2057c2582aad12d87e05ac732113583e0bb..8a3210e5229c14cd750d5bbd4408c2536eab6c59 100644 (file)
--- 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;
   }