CodeIgniter无法通过路由区分Web或CLI访问,需用过滤器拦截Web请求或仅提供CLI命令。CI4中可创建NoWebAccess过滤器并绑定路由,CI3则需在控制器中手动判断STDIN常量且不注册对应路由。

CodeIgniter 路由本身**不区分访问来源(Web 或 CLI)**,它只处理 HTTP 请求的 URI 匹配。所谓“限制路由只允许命令行访问”,实际意思是:**让某条 URL 路径在 Web 端完全不可达,仅能通过 php spark 命令调用对应控制器方法**。这不能靠路由规则实现,而要靠访问控制层拦截。
核心思路:用过滤器(Filter)拦截 Web 请求
CI4 支持在路由执行前插入过滤器。你可创建一个专门拒绝 Web 访问、放行 CLI 的过滤器:
- 在
app/Filters/NoWebAccess.php中定义过滤器类,检查is_cli()函数返回值 - 若不是 CLI 环境(即 HTTP 请求),直接返回 404 或 403 响应,中断流程
- 在
app/Config/Filters.php中注册该过滤器,并绑定到目标路由
具体操作步骤
1. 创建过滤器文件 app/Filters/NoWebAccess.php:
namespace App\Filters;
use CodeIgniter\Filters\FilterInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
class NoWebAccess implements FilterInterface
{
public function before(RequestInterface $request, $arguments = null)
{
if (! is_cli()) {
throw new \CodeIgniter\Exceptions\PageNotFoundException('Not accessible via web.');
}
}
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
{
// 不需要后置处理
}
}
2. 在 app/Config/Filters.php 的 $aliases 中添加:
'no_web' => \App\Filters\NoWebAccess::class,
3. 在 app/Config/Routes.php 中为需保护的路由启用该过滤器:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
$routes->get('admin/clean-cache', 'Admin::cleanCache', ['filter' => 'no_web']);
此后,https://yoursite.com/admin/clean-cache 会直接报错,但 php spark admin:clean-cache 可正常运行(前提是已用 spark 命令注册了该命令)。
替代方案:不注册 Web 路由,只提供 CLI 命令
更干净的做法是——根本不在 Routes.php 中定义该功能的 Web 路由。把逻辑完全封装进自定义命令中:
- 新建
app/Commands/CleanCache.php,继承BaseCommand - 在
run()方法里写业务逻辑(如清缓存、重索引等) - 通过
php spark clean:cache执行,不暴露任何 Web 接口
这种方式天然杜绝 Web 访问风险,也符合职责分离原则。
注意 CI3 的差异处理
CI3 没有过滤器机制,无法在路由层拦截。只能在控制器方法开头手动判断:
public function clean_cache()
{
if (! defined('STDIN')) {
show_404();
}
// 执行 CLI 专属逻辑
}
同时确保该方法**不被任何 $route 规则映射**,避免意外暴露。


















