PHPackages                             middlewares/trailing-slash - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [HTTP &amp; Networking](/categories/http)
4. /
5. middlewares/trailing-slash

ActiveLibrary[HTTP &amp; Networking](/categories/http)

middlewares/trailing-slash
==========================

Middleware to normalize the trailing slash of the uri path

v2.1.0(1y ago)32539.7k↓45%212MITPHPPHP ^7.2 || ^8.0CI failing

Since Sep 30Pushed 1y ago2 watchersCompare

[ Source](https://github.com/middlewares/trailing-slash)[ Packagist](https://packagist.org/packages/middlewares/trailing-slash)[ Docs](https://github.com/middlewares/trailing-slash)[ RSS](/packages/middlewares-trailing-slash/feed)WikiDiscussions master Synced 3d ago

READMEChangelog (10)Dependencies (8)Versions (14)Used By (12)

middlewares/trailing-slash
==========================

[](#middlewarestrailing-slash)

[![Latest Version on Packagist](https://camo.githubusercontent.com/0f46d36cb789d830716aac088f9d7491673d8c9067753333b77e480420625ac9/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6d6964646c6577617265732f747261696c696e672d736c6173682e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/middlewares/trailing-slash)[![Software License](https://camo.githubusercontent.com/55c0218c8f8009f06ad4ddae837ddd05301481fcf0dff8e0ed9dadda8780713e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265)](LICENSE)[![Testing](https://github.com/middlewares/trailing-slash/workflows/testing/badge.svg)](https://github.com/middlewares/trailing-slash/workflows/testing/badge.svg)[![Total Downloads](https://camo.githubusercontent.com/b5d0a9980dff58ad537fd611de956766fef244358e7d0f13a05bd30f35b05cc3/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6d6964646c6577617265732f747261696c696e672d736c6173682e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/middlewares/trailing-slash)

Middleware to normalize the trailing slash of the uri path. By default removes the slash so, for example, `/post/23/` is converted to `/post/23`. Useful if you have problems with the router.

Requirements
------------

[](#requirements)

- PHP &gt;= 7.2
- A [PSR-7 http library](https://github.com/middlewares/awesome-psr15-middlewares#psr-7-implementations)
- A [PSR-15 middleware dispatcher](https://github.com/middlewares/awesome-psr15-middlewares#dispatcher)

Installation
------------

[](#installation)

This package is installable and autoloadable via Composer as [middlewares/trailing-slash](https://packagist.org/packages/middlewares/trailing-slash).

```
composer require middlewares/trailing-slash
```

Example
-------

[](#example)

```
$dispatcher = new Dispatcher([
	(new Middlewares\TrailingSlash(true))
		->redirect()
]);

$response = $dispatcher->dispatch(new ServerRequest());
```

Usage
-----

[](#usage)

By default, this middleware removes the trailing slash of the uri path. Set `true` to the constructor's first argument to add instead remove:

```
//Removes the slash, so /post/23/ is converted to /post/23
$slash = new Middlewares\TrailingSlash();

//Force the slash, so /post/23 is converted to /post/23/
$slash = new Middlewares\TrailingSlash(true);
```

Of course, if the path contains an extension, the slash is **NOT** added. For example, `images/image.png` remains the same, instead be converted to `images/image.png/`.

### redirect

[](#redirect)

If the path must be converted, this option returns a `301` response redirecting to the new path. Optionally, you can provide a `Psr\Http\Message\ResponseFactoryInterface` that will be used to create the redirect response. If it's not defined, [Middleware\\Utils\\Factory](https://github.com/middlewares/utils#factory) will be used to detect it automatically.

```
$responseFactory = new MyOwnResponseFactory();

//Simply removes the slash
$slash = new Middlewares\TrailingSlash();

//Returns a redirect response to the new path
$slash = (new Middlewares\TrailingSlash())->redirect();

//Returns a redirect response to the new path using a specific response factory
$slash = (new Middlewares\TrailingSlash())->redirect($responseFactory);
```

---

Please see [CHANGELOG](CHANGELOG.md) for more information about recent changes and [CONTRIBUTING](CONTRIBUTING.md) for contributing details.

The MIT License (MIT). Please see [LICENSE](LICENSE) for more information.

###  Health Score

51

—

FairBetter than 95% of packages

Maintenance42

Moderate activity, may be stable

Popularity47

Moderate usage in the ecosystem

Community25

Small or concentrated contributor base

Maturity75

Established project with proven stability

 Bus Factor1

Top contributor holds 89.3% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~257 days

Recently: every ~484 days

Total

13

Last Release

469d ago

Major Versions

v0.5.0 → v1.0.02018-01-24

v1.1.0 → v2.0.02019-11-30

PHP version history (4 changes)v0.1.0PHP ^5.6 || ^7.0

v0.5.0PHP ^7.0

v2.0.0PHP ^7.2

v2.0.1PHP ^7.2 || ^8.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/e99df56b617f4af8cf0556a51a0ca20c7420104920c57d7e9eab093f92bb744f?d=identicon)[oscarotero](/maintainers/oscarotero)

![](https://www.gravatar.com/avatar/42e0d72f42eb7d84f67e20d28606da42e5a3248ca908b1eadb4366aafeae2561?d=identicon)[filisko](/maintainers/filisko)

---

Top Contributors

[![oscarotero](https://avatars.githubusercontent.com/u/377873?v=4)](https://github.com/oscarotero "oscarotero (50 commits)")[![filisko](https://avatars.githubusercontent.com/u/8798694?v=4)](https://github.com/filisko "filisko (4 commits)")[![mbolli](https://avatars.githubusercontent.com/u/722725?v=4)](https://github.com/mbolli "mbolli (1 commits)")[![michaelbiberich](https://avatars.githubusercontent.com/u/25563867?v=4)](https://github.com/michaelbiberich "michaelbiberich (1 commits)")

---

Tags

httpmiddlewarepsr-15trailing-slashhttppsr-7middlewarenormalizepathpsr-15slash

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/middlewares-trailing-slash/health.svg)

```
[![Health](https://phpackages.com/badges/middlewares-trailing-slash/health.svg)](https://phpackages.com/packages/middlewares-trailing-slash)
```

###  Alternatives

[mezzio/mezzio

PSR-15 Middleware Microframework

3923.8M126](/packages/mezzio-mezzio)[laminas/laminas-stratigility

PSR-7 middleware foundation for building and dispatching middleware pipelines

587.2M102](/packages/laminas-laminas-stratigility)[middlewares/request-handler

Middleware to execute request handlers

451.8M30](/packages/middlewares-request-handler)[middlewares/fast-route

Middleware to use FastRoute

98205.1k15](/packages/middlewares-fast-route)[middlewares/negotiation

Middleware to implement content negotiation

46458.6k11](/packages/middlewares-negotiation)[middlewares/payload

Middleware to parse the body of the request with support for json, csv and url-encode

33472.0k18](/packages/middlewares-payload)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
