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

PHP/HTACCESS实现仿Discord风格的无后缀友好API

我来帮你搞定这个REST风格API的配置问题!结合你的需求,我会从.htaccess规则配置、文件结构调整、OOP架构适配三个核心部分给出解决方案:

实现Discord风格REST API的完整方案

一、先搞定.htaccess重写规则(解决404/空白页问题)

首先确保你的Apache服务器开启了mod_rewrite模块,然后在网站根目录(或api/目录下)创建.htaccess文件,写入以下规则:

RewriteEngine On
# 跳过真实存在的文件/目录,避免干扰静态资源访问
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 匹配api/accounts/{账户ID}/{资源名}格式的路径,转发到统一路由文件
RewriteRule ^api/accounts/([0-9]+)/([a-z]+)/?$ api/accounts/router.php?account_id=$1&resource=$2 [NC,L,QSA]

规则说明:

  • ^api/accounts/([0-9]+)/([a-z]+)/?$:精准匹配你要的URL格式,捕获数字账户ID和**资源名称(data/inventory等)**两个参数
  • api/accounts/router.php?account_id=$1&resource=$2:把请求转发到统一入口文件,同时传递捕获的参数
  • [NC,L,QSA]:NC不区分大小写,L表示这是最后一条重写规则,QSA保留原有的GET参数(比如你要加的action参数)

二、调整文件结构(符合你的期望层级)

按照你想要的目录结构,建议这样组织API文件:

api/
├── accounts/
│   ├── router.php       # 统一路由入口,负责分发请求
│   ├── DataObj.php      # 处理data资源的OOP类
│   ├── InventoryObj.php # 处理inventory资源的类
│   ├── ServersObj.php   # 处理servers资源的类
│   └── GameObj.php      # 处理game资源的类
└── .htaccess            # 若把重写规则放在api目录下,就放这里

三、编写统一路由文件router.php

这个文件是API的入口,负责解析请求参数、加载对应类并执行方法,完美适配你的OOP架构:

<?php
// 开启错误提示,方便调试空白页问题
error_reporting(E_ALL);
ini_set('display_errors', 1);

// 获取重写传递的核心参数
$accountId = $_GET['account_id'] ?? null;
$resource = $_GET['resource'] ?? null;
$action = $_GET['action'] ?? 'execute'; // 默认执行execute方法

// 校验必填参数
if (!$accountId || !is_numeric($accountId) || !$resource) {
    http_response_code(400);
    echo json_encode(['error' => '无效的请求参数']);
    exit;
}

// 拼接类名和文件路径,自动加载对应资源类
$className = ucfirst($resource) . 'Obj';
$classFile = __DIR__ . '/' . $className . '.php';

if (!file_exists($classFile)) {
    http_response_code(404);
    echo json_encode(['error' => '指定资源不存在']);
    exit;
}
require_once $classFile;

// 收集请求中的其他参数(POST/GET)
$postData = $_POST ?? [];
$extraParams = array_filter($_GET, fn($key) => !in_array($key, ['account_id', 'resource', 'action']));

// 实例化对象并调用指定方法
try {
    $apiObj = new $className($accountId, $extraParams, $postData);
    if (method_exists($apiObj, $action)) {
        $result = $apiObj->$action();
        echo json_encode(['data' => $result]);
    } else {
        http_response_code(400);
        echo json_encode(['error' => '不支持的操作类型']);
    }
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['error' => '服务器内部错误:' . $e->getMessage()]);
}
?>

四、适配你的OOP类(以DataObj.php为例)

保持你原有类的逻辑,只需调整构造参数即可:

<?php
class DataObj {
    private $accountId;
    private $extraParams;
    private $postData;

    public function __construct($accountId, $extraParams, $postData) {
        $this->accountId = $accountId;
        $this->extraParams = $extraParams;
        $this->postData = $postData;
    }

    public function execute() {
        // 这里写你原来的业务逻辑,比如获取账户数据
        return [
            'account_id' => $this->accountId,
            'data' => '示例账户数据',
            'extra' => $this->extraParams
        ];
    }

    // 可以扩展其他action方法,比如更新数据
    public function update() {
        // 处理POST数据的更新逻辑
        return ['status' => 'success', 'message' => '数据已更新'];
    }
}
?>

测试与问题排查

  • 空白页:在router.php开头开启错误提示,检查是否有语法错误或类文件路径错误
  • 404错误:确认mod_rewrite已开启,.htaccess路径正确,重写规则中的文件路径和实际文件匹配
  • 参数异常:在router.php中用var_dump($_GET)打印参数,确认重写规则是否正确传递了account_id和resource

配置完成后,你就可以这样访问API了:

  • https://example.com/api/accounts/1234567890/data/ → 调用DataObj的execute方法
  • https://example.com/api/accounts/1234567890/inventory/?action=get → 调用InventoryObj的get方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:18:11