You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Fat-Free Framework路由以支持含点的路径访问?

解决Fat-Free Framework路由中带.tar后缀路径的404问题

问题分析

访问http://localhost:9000/get/123/123/123.tar时出现404,但去掉.tar后缀的路径可正常访问,核心原因有两种:

  1. PHP内置服务器行为:若用php -S启动服务器但未指定路由脚本,PHP会直接处理带扩展名的请求(如.tar),而非转发到F3入口文件。
  2. F3静态文件优先级:F3默认优先检查请求路径是否对应静态文件,找不到文件时直接返回404,不触发路由规则。

解决方案

方案1:修正PHP内置服务器启动命令

使用PHP内置服务器时,需明确指定路由脚本(即你的F3入口文件),确保所有请求经过F3处理:

php -S localhost:9000 index.php

方案2:调整F3路由规则或禁用静态文件检查

方法A:用正则路由匹配含扩展名的路径

将通配符*替换为正则表达式,确保捕获包含.的路径段:

require 'vendor/autoload.php';
$f3 = \Base::instance();

// 正则路由匹配任意字符(包括点)的路径段
$f3->route('GET @get_file: /get/([^/]+)/([^/]+)/([^/]+)',
    function ($f3,$params) {
        $filename = $params[3];
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . $filename . '"');
        $tmpFile = __DIR__ . '/tmpfile';
        header('Content-Length: ' . filesize($tmpFile));
        readfile($tmpFile);
    }
);
$f3->run();

方法B:禁用指定路径的静态文件检查

通过AUTOLOAD设置排除/get路径的静态文件检查,强制请求走路由规则:

require 'vendor/autoload.php';
$f3 = \Base::instance();

// 禁用/get路径的静态文件自动加载
$f3->set('AUTOLOAD', function($path) {
    if (str_starts_with($path, '/get/')) {
        return false;
    }
    return true;
});

$f3->route('GET /get/*/*/*',
    function ($f3,$params) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . $params[3] . '"');
        $tmpFile = __DIR__ . '/tmpfile';
        header('Content-Length: ' . filesize($tmpFile));
        readfile($tmpFile);
    }
);
$f3->run();

验证

修改后重启服务器,访问http://localhost:9000/get/123/123/123.tar,应能正常触发文件下载逻辑。

内容的提问来源于stack exchange,提问作者Dayong Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:07:44