lyrasoft / firewall
LYRASOFT 的防火墙软件包
Requires
- mlocati/ip-lib: ^1.18
README
安装
通过 composer 安装
composer require lyrasoft/firewall
然后将文件复制到项目中
php windwalker pkg:install lyrasoft/firewall -t routes -t migrations
语言文件
如果您不想覆盖语言,请将此行添加到管理器 & 前端中间件中
$this->lang->loadAllFromVendor('lyrasoft/firewall', 'ini'); // OR $this->lang->loadAllFromVendor(\Lyrasoft\Firewall\FirewallPackage::class, 'ini');
或者运行此命令以复制语言文件
php windwalker pkg:install lyrasoft/firewall -t lang
注册管理菜单
编辑 resources/menu/admin/sidemenu.menu.php
$menu->link($this->trans('unicorn.title.grid', title: $this->trans('firewall.redirect.title'))) ->to($nav->to('redirect_list')->var('type', 'main')) ->icon('fal fa-angles-right'); $menu->link($this->trans('unicorn.title.grid', title: $this->trans('firewall.ip.rule.title'))) ->to($nav->to('ip_rule_list')->var('type', 'main')) ->icon('fal fa-network-wired');
重定向
将 RedirectMiddleware
添加到 etc/app/main.php
use Lyrasoft\Firewall\Middleware\RedirectMiddleware; // ... 'middlewares' => [ \Windwalker\DI\create( RedirectMiddleware::class, ignores: [ 'admin/*' ] ), // ... ],
现在您可以在管理器中添加重定向记录
源路径规则
- 在开始时添加
/
,路径将从网站基本根目录进行比较(而不是域名根目录)。 - 如果您启用了
Regex
- 添加
*
将将路径段与任何字符串进行比较。 - 添加
**
将比较跨段。 - 您可以添加自定义正则表达式规则,例如:
/foo/(\d+)
- 添加
目标路径
目标路径可以是相对路径:foo/bar
或完整 URL:https://simular.co/foo/bar
。
如果您启用了 Regex
,您可以使用以 $
开头的变量来插入匹配的字符串。例如,一个 foo/*/edit/(\d+)
,可以重定向到 new/path/$1/edit/$2
其他参数
仅 404
:只有当页面是 404 时才重定向,如果页面 URL 存在,则不会重定向。处理地区
:如果该网站是多语言的,则此参数将自动检测起始语言前缀并将其自动添加到目标路径,您可以在目标路径中使用{lang}
来自定义设置语言别名位置。
从数据库使用不同类型
重定向表有 type
列,您可以使用 admin/redirect/list/{type}
来管理不同类型。
如果您想为中间件选择类型,您可以这样做
// ... 'middlewares' => [ \Windwalker\DI\create( RedirectMiddleware::class, type: 'other_type', ignores: [ 'admin/*' ] ), // ... ],
类型支持 string|Enum|array|null|false
,如果您向其中发送 NULL
,则表示所有重定向记录。如果您发送 FALSE
,则表示不使用数据库记录。
使用自定义列表
您可以使用自定义重定向列表,自定义列表将自动启用正则表达式
此设置将合并数据库列表和自定义列表。
// ... 'middlewares' => [ \Windwalker\DI\create( RedirectMiddleware::class, type: 'flower', list: [ 'foo/bar' => 'hello/world', 'foo/yoo/*' => 'hello/mountain/$1', ], ignores: [ 'admin/*' ] ), // ... ],
此设置将禁用数据库列表并仅使用自定义列表。
// ... 'middlewares' => [ \Windwalker\DI\create( RedirectMiddleware::class, type: false, list: [ 'foo/bar' => 'hello/world', 'foo/yoo/*' => 'hello/mountain/$1', ], ignores: [ 'admin/*' ] ), // ... ],
自定义列表可以使用闭包来生成列表
// ... 'middlewares' => [ \Windwalker\DI\create( RedirectMiddleware::class, // ... list: raw(function (FooService $fooService) { return ...; }); ), // ... ],
自定义列表的重定向状态码默认为 301
,如果您想使用其他状态,将其设置为
REDIRECT_DEFAULT_STATUS
环境变量。
即时重定向
如果您有某种原因不能等待 RedirectResponse
返回,您可以使用即时重定向
// ... 'middlewares' => [ \Windwalker\DI\create( RedirectMiddleware::class, // ... instantRedirect: true, ), // ... ],
禁用
如果您想在调试模式下禁用此中间件,请添加此选项
\Windwalker\DI\create( RedirectMiddleware::class, enabled: !WINDWALKER_DEBUG ),
钩子
添加 afterHit
钩子,您可以在重定向命中时进行某些操作或记录。
\Windwalker\DI\create( RedirectMiddleware::class, afterHit: raw(function (string $dest, \Redirect $redirect) { \Windwalker\Core\Manager\Logger::info('Redirect to: ' . $dest); }) ),
IP 允许/阻止(防火墙)
要启用 IP 规则,请将 FirewallMiddleware
添加到 front.route.php
use Lyrasoft\Firewall\Middleware\FirewallMiddleware; // ... ->middleware( FirewallMiddleware::class, ) // ...
管理管理员 IP 规则
选择允许或阻止,并输入 IP 范围格式
支持的格式
我们使用 mlocati/ip-lib 作为 IP 范围解析器。
选择数据库类型
您也可以通过 ip-rule/list/{type}
访问不同类型的规则。
并将类型名称设置为中间件
->middleware( FirewallMiddleware::class, type: 'foo' )
类型也支持 string,array 和 enum。使用 NULL
来选择所有,使用 FALSE
来禁用数据库。
自定义列表
如果您想手动设置IP列表,则必须在FirewallMiddleware
自定义列表中使用2个列表:allowList
和blockList
。
->middleware( FirewallMiddleware::class, type: false, allowList: [ '0.0.0.0', '144.122.*.*', ], blockList: [ '165.2.90.45', '222.44.55.66', ], )
禁用
如果您想在调试模式下禁用此中间件,请添加此选项
\Windwalker\DI\create( FirewallMiddleware::class, enabled: !WINDWALKER_DEBUG ),
钩子
添加afterHit
钩子,以便在IP被阻止时执行某些操作或记录。
\Windwalker\DI\create( FirewallMiddleware::class, afterHit: raw(function (AppRequest $appRequest) { \Windwalker\Core\Manager\Logger::info('Attack from: ' . $appRequest->getClientIp()); }) ),
缓存
缓存有效期
这两个中间件都有一个cacheTtl
参数,默认为3600
秒。
\Windwalker\DI\create( FirewallMiddleware::class, cacheTtl: 3600 ),
清除缓存
每次编辑Redirect
或IpRule
时,都会自动清除所有缓存。
缓存文件位于caches/firewall/
,您可以在composer.json
中添加firewall
以清除缓存命令。
"post-autoload-dump": [ ... "php windwalker cache:clear renderer html firewall" <-- Add firewall ],
缓存禁用
在调试模式下或当ttl
设置为0
时,将禁用缓存。