lazychanger / urlrewrite
Easy and quickly add url rewrite with psr/http-message
v0.1.4
2023-05-11 07:01 UTC
Requires
- php: >=8.0
- psr/http-message: ^1.0
Requires (Dev)
- hyperf/http-server: ^3.0
- mockery/mockery: ^1.5
- nikic/fast-route: ^1.3
- phpstan/phpstan: ^1.0
- phpunit/phpunit: ^9.5
- swoole/ide-helper: ^4.5
README
Introduction
Easy, simple and elegant way to add http rewrite rule with psr/http-message
.
UrlRewriteRule
name | comment |
---|---|
matchPath | match path prefix or exact path |
matchHost | match request header Host |
regMatchPath | use regexp match path |
regMatchHost | use regexp match host |
matchMethod | match request method,not allowed to be used alone |
How to Use
Match the prefix path
$request = (new UrlRewrite([ UrlRewriteRule::matchPath('/enter')->rewriteTo('/rewrite'), ]))->rewrite($request);
- match:
/enter
=>/rewrite
- match:
/enter/foo
=>/rewrite/foo
- match:
/enter1/foo
=>/rewrite1/foo
- nomatch:
/nomatch/foo
=>/nomatch/foo
Match the exact path
$request = (new UrlRewrite([ UrlRewriteRule::matchPath('/enter', true)->rewriteTo('/rewrite'), ]))->rewrite($request);
- match:
/enter
=>/rewrite
- nomatch:
/enter/foo
=>/enter/foo
Match host
$request = (new UrlRewrite([ UrlRewriteRule::matchHost('example.com')->rewriteTo('/rewrite'), ]))->rewrite($request);
- match:
example.com/enter
=>example.com/rewrite
- match:
example.com/enter/foo
=>example.com/rewrite
- nomatch
sub.example.com/enter/foo
=>sub.example.com/enter/foo
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
=>sub.example.com/rewrite/sub/1
- match:
sub2.example.com/user/2
=>sub.example.com/rewrite/sub2/2
- nomatch:
example.com/enter/foo
=>example.com/enter/foo
- nomatch:
sub.example.com/user/foo
=>sub.example.com/user/foo
Q&A
How can i got old path
Obtain through the request header X-Real-Path
, just rewriteTo
, no rewriteToFn
How to use in hyperf
- Require package and publish config
composer require lazychanger/urlrewrite php ./bin/hyperf vendor:publish lazychanger/urlrewrite
- 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
- Regexp Route Parse nikic/fast-route