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)32506.3k↓10.6%211MITPHPPHP ^7.2 || ^8.0CI passing

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 1mo ago

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

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 96% of packages

Maintenance45

Moderate activity, may be stable

Popularity46

Moderate usage in the ecosystem

Community24

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

423d 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

[middlewares/request-handler

Middleware to execute request handlers

451.6M26](/packages/middlewares-request-handler)[middlewares/fast-route

Middleware to use FastRoute

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

Middleware to implement content negotiation

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

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

32466.8k17](/packages/middlewares-payload)[middlewares/http-authentication

Middleware to implement Basic and Digest Http authentication

35302.0k2](/packages/middlewares-http-authentication)[mezzio/mezzio-authentication

Authentication middleware for Mezzio and PSR-7 applications

121.6M26](/packages/mezzio-mezzio-authentication)

PHPackages © 2026

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