PHPackages                             lazychanger/urlrewrite - 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. [PSR &amp; Standards](/categories/psr-standards)
4. /
5. lazychanger/urlrewrite

ActiveLibrary[PSR &amp; Standards](/categories/psr-standards)

lazychanger/urlrewrite
======================

Easy and quickly add url rewrite with psr/http-message

v0.1.5(10mo ago)461MITPHPPHP &gt;=8.0CI passing

Since May 11Pushed 10mo agoCompare

[ Source](https://github.com/lazychanger/urlrewrite)[ Packagist](https://packagist.org/packages/lazychanger/urlrewrite)[ Docs](https://github.com/lazychanger/urlrewrite)[ RSS](/packages/lazychanger-urlrewrite/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (1)Dependencies (8)Versions (4)Used By (0)

UrlRewrite
==========

[](#urlrewrite)

[![PHP Composer](https://github.com/lazychanger/urlrewrite/actions/workflows/php.yml/badge.svg)](https://github.com/lazychanger/urlrewrite/actions/workflows/php.yml)[![PHPUnit](https://github.com/lazychanger/urlrewrite/actions/workflows/test.yml/badge.svg)](https://github.com/lazychanger/urlrewrite/actions/workflows/test.yml)[![Release](https://github.com/lazychanger/urlrewrite/actions/workflows/release.yml/badge.svg)](https://github.com/lazychanger/urlrewrite/actions/workflows/release.yml)

Introduction
------------

[](#introduction)

Easy, simple and elegant way to add http rewrite rule with `psr/http-message`.

UrlRewriteRule
--------------

[](#urlrewriterule)

namecommentmatchPathmatch path prefix or exact pathmatchHostmatch request header `Host`regMatchPathuse regexp match pathregMatchHostuse regexp match hostmatchMethodmatch request method，not allowed to be used aloneHow to Use
----------

[](#how-to-use)

### Match the prefix path

[](#match-the-prefix-path)

```
$request = (new UrlRewrite([
    UrlRewriteRule::matchPath('/enter')->rewriteTo('/rewrite'),
]))->rewrite($request);
```

- match: `/enter` =&gt; `/rewrite`
- match: `/enter/foo` =&gt; `/rewrite/foo`
- match: `/enter1/foo` =&gt; `/rewrite1/foo`
- nomatch: `/nomatch/foo` =&gt; `/nomatch/foo`

### Match the exact path

[](#match-the-exact-path)

```
$request = (new UrlRewrite([
    UrlRewriteRule::matchPath('/enter', true)->rewriteTo('/rewrite'),
]))->rewrite($request);
```

- match: `/enter` =&gt; `/rewrite`
- nomatch: `/enter/foo` =&gt; `/enter/foo`

### Match host

[](#match-host)

```
$request = (new UrlRewrite([
    UrlRewriteRule::matchHost('example.com')->rewriteTo('/rewrite'),
]))->rewrite($request);
```

- match: `example.com/enter` =&gt; `example.com/rewrite`
- match: `example.com/enter/foo` =&gt; `example.com/rewrite`
- nomatch `sub.example.com/enter/foo` =&gt; `sub.example.com/enter/foo`

### Use regexp match host

[](#use-regexp-match-host)

```
$request = (new UrlRewrite([
    UrlRewriteRule::regMatchHost('{subdomain:[a-z]+}.example.com')
    ->regMatchPath('/user/{id:\d+}')
    ->rewriteTo('/rewrite/{subdomain}/{id}'),
]))->rewrite($request);
```

- match: `sub.example.com/user/1` =&gt; `sub.example.com/rewrite/sub/1`
- match: `sub2.example.com/user/2` =&gt; `sub.example.com/rewrite/sub2/2`
- nomatch: `example.com/enter/foo` =&gt; `example.com/enter/foo`
- nomatch: `sub.example.com/user/foo` =&gt; `sub.example.com/user/foo`

Q&amp;A
-------

[](#qa)

### How can i got old path

[](#how-can-i-got-old-path)

**Obtain through the request header `X-Real-Path`, just `rewriteTo`, no `rewriteToFn`**

### How to use in hyperf

[](#how-to-use-in-hyperf)

1. Require package and publish config

```
composer require lazychanger/urlrewrite
php ./bin/hyperf vendor:publish lazychanger/urlrewrite
```

2. Replace CoreMiddleware in `config/autoload/dependencies.php` or add the code to your CoreMiddleware

```
// add config/autoload/dependencies.php config

use Hyperf\HttpServer\Contract\CoreMiddlewareInterface;
use LazyChanger\UrlRewrite\Middleware\CoreMiddleware;

return [
  CoreMiddlewareInterface::class => CoreMiddleware::class
];
```

```
// or add UrlRewrite code in app/Middleware/CoreMiddleware.php

class CoreMiddleware extends HyperfCoreMiddleware
{
    protected UrlRewrite $rewrite;

    public function __construct(ContainerInterface $container, string $serverName)
    {
        parent::__construct($container, $serverName);

        // add UrlRewrite object
        $this->rewrite = $this->container->get(UrlRewrite::class);
    }

    public function dispatch(ServerRequestInterface $request): ServerRequestInterface
    {
        return parent::dispatch($this->rewrite->rewrite($request));
    }
}
```

Thanks
------

[](#thanks)

- Regexp Route Parse [nikic/fast-route](https://github.com/nikic/FastRoute)

###  Health Score

30

—

LowBetter than 64% of packages

Maintenance54

Moderate activity, may be stable

Popularity9

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity41

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% 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 ~394 days

Total

3

Last Release

309d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/18ad91cd8941a8d5a576407d3699cdb7667c1fc57a88ce77e761616499f9f03b?d=identicon)[lazychanger](/maintainers/lazychanger)

---

Top Contributors

[![lazychanger](https://avatars.githubusercontent.com/u/20916944?v=4)](https://github.com/lazychanger "lazychanger (14 commits)")

---

Tags

psrhttp-messagephprewritehyperfurlrewrite

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan, Psalm

Type Coverage Yes

### Embed Badge

![Health badge](/badges/lazychanger-urlrewrite/health.svg)

```
[![Health](https://phpackages.com/badges/lazychanger-urlrewrite/health.svg)](https://phpackages.com/packages/lazychanger-urlrewrite)
```

###  Alternatives

[lctrs/psalm-psr-container-plugin

Let Psalm understand better psr11 containers

17648.1k13](/packages/lctrs-psalm-psr-container-plugin)

PHPackages © 2026

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