如何在 PHP 中将子目录的 index.php 设为该目录下的默认路由入口

千敏酱_2534

千敏酱_2534

2026-04-03

680人浏览

原创

如何在 PHP 中将子目录的 index.php 设为该目录下的默认路由入口

本文讲解如何通过 apache 的 .htaccess 文件正确配置 url 重写规则,使访问如 /items/general 时由 items/index.php 统一处理,而非根目录 index.php 或返回 404。核心在于 rewriterule 的路径匹配逻辑与作用范围。

本文讲解如何通过 apache 的 .htaccess 文件正确配置 url 重写规则,使访问如 /items/general 时由 items/index.php 统一处理,而非根目录 index.php 或返回 404。核心在于 rewriterule 的路径匹配逻辑与作用范围。

在 PHP Web 开发中,常需实现“前端控制器模式”(Front Controller Pattern)——即让子目录下的 index.php 充当该目录所有请求的统一入口。例如,项目结构如下:

/htdocs/
├── index.php              # 根目录入口(主站)
└── items/
    └── index.php          # 子目录专用入口(用于 items/* 路由)

目标是:当用户访问 https://example.com/items/general、/items/list?sort=desc 或 /items/123/edit 时,均由 /items/index.php 接收并解析请求路径,而不是触发 404 或误入根目录 index.php。

✅ 正确配置方式(推荐)

在 /items/.htaccess 文件中写入以下内容(注意文件名是 .htaccess,不是 .htacces):

RewriteEngine On
RewriteBase /items/

# 将所有进入 /items/ 下的请求(无论路径)转发给 index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]

? 关键说明:

  • RewriteBase /items/:明确告诉 Apache 当前 .htaccess 所在上下文路径,避免重写路径计算错误;
  • RewriteCond %{REQUEST_FILENAME} !-f 和 !-d:仅当请求路径不对应真实文件或目录时才重写(防止 CSS/JS/图片等静态资源被错误拦截);
  • ^(.*)$:匹配任意非空路径(包括 general、list/123、api/json 等);
  • [L,QSA]:L 表示终止后续规则;QSA(Query String Append)确保原始查询参数(如 ?page=2)自动透传到 index.php。

⚠️ 注意:根目录 .htaccess 不应干扰子目录规则。若根目录也有重写逻辑,请确保其 RewriteRule 不覆盖 /items/ 前缀(例如避免使用 ^.*$ 无条件捕获)。

? 示例:items/index.php 如何读取原始路径

在 /items/index.php 中,可通过 $_SERVER['REQUEST_URI'] 获取完整请求路径,并做路由分发:

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
<?php // items/index.php
$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$pathParts = array_filter(explode('/', $requestUri));

// 示例:/items/general → $pathParts = ['items', 'general']
if (isset($pathParts[1])) {
    $action = $pathParts[1];
    switch ($action) {
        case 'general':
            echo "<h1>General Section";
            break;
        case 'list':
            echo "<h1>Item List</h1>";
            break;
        default:
            http_response_code(404);
            echo "<h1>Not Found</h1>";
    }
} else {
    echo "<h1>Items Home</h1>";
}

❌ 原方案为何失败?

你最初尝试的规则:

RewriteRule ^/?$ items/index.php [L]

仅匹配空路径(即 /items/ 或 /items),而 /items/general 完全不满足 ^/?$,因此 Apache 直接查找物理路径 items/general,找不到就返回 404。

而答案中建议的 RewriteRule items/ items/index.php [L] 虽能触发,但存在严重缺陷:它会在任何包含 items/ 的 URL 中触发(如 /blog/items/post),且未启用 QSA,也未排除静态资源,不推荐在生产环境使用。

✅ 最佳实践总结

  • ✅ 将 .htaccess 放在子目录(如 /items/.htaccess),而非根目录;
  • ✅ 始终使用 RewriteBase 明确上下文;
  • ✅ 添加 !-f / !-d 条件保护静态资源;
  • ✅ 使用 QSA 保留查询参数;
  • ✅ 在 index.php 中用 parse_url($_SERVER['REQUEST_URI']) 安全提取路径;
  • ❌ 避免模糊正则(如 (\w+)/)或无条件重写,以防规则冲突或安全风险。

完成配置后,重启 Apache 或清除浏览器缓存,即可验证 /items/anything?param=value 均由 items/index.php 成功接管。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

12524

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

7221

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2235

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4548

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

5274

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

4131

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5997

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4702

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12482

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习