@@ -21,13 +21,25 @@ const koa404Handler = require('koa-404-handler');
2121const koaConnect = require ( 'koa-connect' ) ;
2222const multimatch = require ( 'multimatch' ) ;
2323const ratelimit = require ( '@ladjs/koa-simple-ratelimit' ) ;
24- const removeTrailingSlashes = require ( 'koa-no-trailing-slash' ) ;
2524const requestId = require ( 'express-request-id' ) ;
2625const requestReceived = require ( 'request-received' ) ;
2726const responseTime = require ( 'response-time' ) ;
2827const sharedConfig = require ( '@ladjs/shared-config' ) ;
2928const { boolean } = require ( 'boolean' ) ;
3029
30+ // https://gist.github.com/titanism/241fc0c5f1c1a0b7cae3d97580e435fb
31+ function removeTrailingSlashes ( ctx , next ) {
32+ const { path, search } = ctx . request ;
33+ if ( path !== '/' && ! path . startsWith ( '//' ) && path . slice ( - 1 ) === '/' ) {
34+ const redirectUrl = path . slice ( 0 , - 1 ) + search ;
35+ ctx . response . status = 301 ;
36+ ctx . redirect ( redirectUrl ) ;
37+ return ;
38+ }
39+
40+ return next ( ) ;
41+ }
42+
3143class API {
3244 // eslint-disable-next-line complexity
3345 constructor ( config , Users ) {
@@ -108,7 +120,7 @@ class API {
108120 if ( this . config . auth ) app . use ( auth ( this . config . auth ) ) ;
109121
110122 // Remove trailing slashes
111- app . use ( removeTrailingSlashes ( ) ) ;
123+ app . use ( removeTrailingSlashes ) ;
112124
113125 // I18n
114126 if ( this . config . i18n ) {
0 commit comments