Trailing slash redirect middleware for Connect and Express.js applications
npx @tessl/cli install tessl/npm-connect-slashes@1.4.0connect-slashes is a trailing slash redirect middleware for Connect and Express.js applications. It provides canonical URL handling by consistently appending or removing trailing slashes from request URLs, helping with SEO optimization and URL consistency in Node.js web applications.
npm install connect-slashesconst slashes = require("connect-slashes");For ES Modules (when using with modern bundlers):
import slashes from "connect-slashes";const connect = require("connect");
const slashes = require("connect-slashes");
// Append trailing slashes (default behavior)
connect()
.use(connect.static())
.use(slashes()) // must come after static middleware!
.listen(3000);
// Remove trailing slashes
connect()
.use(connect.static())
.use(slashes(false))
.listen(3000);For Express.js:
const express = require("express");
const slashes = require("connect-slashes");
const app = express();
app.use(express.static("public"));
app.use(slashes()); // append trailing slashes
app.listen(3000);Creates a Connect/Express middleware function that handles trailing slash redirects.
/**
* Creates trailing slash redirect middleware
* @param {boolean} append - Whether to append trailing slashes (default: true)
* @param {SlashesOptions} options - Configuration options
* @returns {Function} Connect/Express middleware function
*/
function slashes(append, options);
interface SlashesOptions {
/** HTTP status code for redirects (default: 301) */
code?: number;
/** Base path to prepend to redirect URLs (default: "") */
base?: string;
/** Additional HTTP headers for redirect responses (default: {}) */
headers?: { [key: string]: string };
}Parameters:
append (boolean, optional): Controls slash behavior
true (default): Appends trailing slashes to URLs that don't have themfalse: Removes trailing slashes from URLs that have themoptions (object, optional): Configuration object with the following properties:
code (number): HTTP status code for redirects (default: 301 Moved Permanently)base (string): Base path to prepend to redirect URLs, useful for reverse proxy scenariosheaders (object): Additional HTTP headers to include in redirect responsesReturns: A middleware function with signature (req, res, next) => void
Usage Examples:
// Basic usage - append trailing slashes with 301 redirects
app.use(slashes());
// Remove trailing slashes
app.use(slashes(false));
// Custom redirect status code
app.use(slashes(true, { code: 302 }));
// Add base path for reverse proxy scenarios
app.use(slashes(true, { base: "/blog" }));
// Include custom headers in redirect responses
app.use(slashes(true, {
headers: { "Cache-Control": "public, max-age=3600" }
}));
// Combined options
app.use(slashes(true, {
code: 302,
base: "/api",
headers: { "X-Redirect-Reason": "trailing-slash" }
}));The returned middleware function processes HTTP requests with the following behavior:
req.originalUrl when available (Express compatibility), falls back to req.url//foo becomes /foo/)/ for proper absolute redirectsappend settingRedirect Logic:
append is true (default):
/ are not modified/ is never modifiedappend is false:
/ is never modified (exception case)connect.static() or express.static()) to avoid redirecting static file requests incorrectly