diff --git a/spec/app_root_test.js b/spec/app_root_test.js
index 67151e4f1ca1eb344c75ebceee33c2ccd3889bb7..b6a9f74bf90d723332e6c30007a6331c03627c41 100644
--- a/spec/app_root_test.js
+++ b/spec/app_root_test.js
@@ -39,8 +39,7 @@ describe('With different app root', function () {
         }
       }
     })
-    process.env.APP_ROOT = '/appsuite/'
-    app = await injectApp()
+    app = await injectApp('/appsuite/')
   })
 
   afterEach(async function () {
diff --git a/spec/util.js b/spec/util.js
index 04a3a341e409d043e74896a39d71835ae978d6af..2341975b6530b2ce4f95d20fcf340b099026de96 100644
--- a/spec/util.js
+++ b/spec/util.js
@@ -65,8 +65,9 @@ export function mockRedis (data = {}, isEnabled = true) {
   return mock
 }
 
-export async function injectApp () {
+export async function injectApp (appRoot = '/') {
   register.clear()
+  process.env.APP_ROOT = appRoot
   const { configMap } = await import('../src/config_map.js')
   const { getLatestVersion } = await import('../src/version.js')
 
@@ -76,7 +77,9 @@ export async function injectApp () {
   app.register(sensible)
   app.register(urlData)
   app.register(formbody)
-  app.register(autoLoad, { dir: join(__dirname, '../src/routes'), prefix: process.env.APP_ROOT, autoHooks: true })
+  const autoLoadOptions = { dir: join(__dirname, '../src/routes'), autoHooks: true }
+  if (appRoot) autoLoadOptions.options = { prefix: String(appRoot).replace(/\/$/, '') }
+  app.register(autoLoad, autoLoadOptions)
 
   return app
 }
diff --git a/src/index.js b/src/index.js
index 5ef2eeaa41d691648979ed1aad1d4aba8f59fa5b..2980e0aaeeadaa3f386bf547740b18ab565c76d1 100644
--- a/src/index.js
+++ b/src/index.js
@@ -45,7 +45,9 @@ app.register(autoLoad, { dir: join(__dirname, 'plugins') })
 
 // Register routes
 // Note: routes are loaded in alphabetical order
-app.register(autoLoad, { dir: join(__dirname, 'routes'), prefix: process.env.APP_ROOT, autoHooks: true })
+const autoLoadOptions = { dir: join(__dirname, 'routes'), autoHooks: true }
+if (process.env.APP_ROOT !== '/') autoLoadOptions.options = { prefix: String(process.env.APP_ROOT).replace(/\/$/, '') }
+app.register(autoLoad, autoLoadOptions)
 
 app.addHook('onReady', () => {
   // don't block the onReady hook
diff --git a/src/routes/autohooks.js b/src/routes/autohooks.js
index 4ce8d4ecd725fe270e2e581dfb18753212f610dc..31a3fe39c0980436d85cdad96e4a5deade5d5677 100644
--- a/src/routes/autohooks.js
+++ b/src/routes/autohooks.js
@@ -18,11 +18,12 @@ export default async function (app, opts) {
     done()
   })
 
+  const slowRequestThreshold = parseInt(process.env.SLOW_REQUEST_THRESHOLD) || 4000
+
   // Logs the request with the 'debug' level and also logs headers with the 'trace' level
   app.addHook('onResponse', (req, reply, done) => {
     const responseTime = reply.getResponseTime()
     const loggingOptions = { url: req.raw.url, res: reply, method: req.method, responseTime }
-    const slowRequestThreshold = parseInt(process.env.SLOW_REQUEST_THRESHOLD) || 4000
     /* c8 ignore next */
     if (process.env.LOG_LEVEL === 'trace') loggingOptions.headers = req.headers
     reply.log.debug(loggingOptions, 'request completed')
diff --git a/src/routes/redirects.js b/src/routes/redirects.js
index e2921c8f6a5bac58926560c36444aa577a2d06cd..0adb224a1385c3e0bf69970e6344cdf6b18321d5 100644
--- a/src/routes/redirects.js
+++ b/src/routes/redirects.js
@@ -9,7 +9,7 @@ export default async function redirectsPlugin (fastify) {
   })
 
   if (process.env.APP_ROOT.length > 1) {
-    fastify.get(process.env.APP_ROOT.slice(0, -1), async (req, res) => {
+    fastify.get('', async (req, res) => {
       res.redirect(process.env.APP_ROOT)
     })
   }