Skip to main content

Lowercase Redirection

Overview

The lowercase redirection middleware automatically redirects URLs containing uppercase letters to their lowercase equivalent. This ensures URL consistency and helps with SEO by preventing duplicate content issues.

Related RFC

Use Cases

  • SEO Optimization: Prevent duplicate content penalties from search engines

Usage

Import the middleware from @traveloka/core/server:

import { lowercaseRedirectionMiddleware } from '@traveloka/core/server';

app.use(
lowercaseRedirectionMiddleware([
{
pattern: /^\/flight/, // Match flight routes
statusCode: 301, // Permanent redirect (default)
},
{
pattern: /^\/hotel/,
statusCode: 302, // Temporary redirect
},
])
);

Configuration

Parameters

The middleware accepts an array of configuration objects:

PropertyTypeRequiredDefaultDescription
patternRegExpYes-Regex pattern to match request paths. Automatically enforced as case-insensitive.
statusCode301 | 302 | 307 | 308No301HTTP redirect status code.

Status Codes

  • 301: Permanent redirect (default) - Browser caches the redirect
  • 302: Temporary redirect - Browser doesn't cache
  • 307: Temporary redirect (preserves request method)
  • 308: Permanent redirect (preserves request method)

Examples

Basic Example

Redirect all flight paths to lowercase:

app.use(lowercaseRedirectionMiddleware([{ pattern: /^\/flight/ }]));

Before: /Flight/Search?from=CGK
After: /flight/search?from=CGK

Multiple Routes

Handle different sections with different redirect types:

app.use(
lowercaseRedirectionMiddleware([
{ pattern: /^\/flight/, statusCode: 301 },
{ pattern: /^\/hotel/, statusCode: 301 },
{ pattern: /^\/car/, statusCode: 302 },
])
);

Preserve Query Parameters

Query parameters are automatically preserved:

app.use(
lowercaseRedirectionMiddleware([{ pattern: /^\/(en-id|id-id)\/flight/ }])
);

Before: /en-id/Flight/Search?from=CGK&to=DPS
After: /en-id/flight/search?from=CGK&to=DPS

Behavior

  1. Pattern Matching: The middleware checks each request path against configured patterns
  2. Case Detection: If a match is found and the path contains uppercase letters, a redirect is triggered
  3. Query Preservation: All query parameters are preserved during redirection
  4. Lowercase Enforcement: Patterns are automatically made case-insensitive for matching