文档目录
Apache配置

简介

本文件面向在Apache上部署DouPHP项目的运维与开发者,聚焦以下目标:

  • 说明基于.htaccess的URL重写规则(伪静态、API/后台路由、入口统一)
  • 解释需要启用的Apache模块(如mod_rewrite、mod_ssl等)及启用方式
  • 提供虚拟主机配置示例与多站点部署方法
  • 给出Apache层性能优化建议(KeepAlive、缓存头、压缩等)
  • 给出安全加固要点(禁止目录浏览、敏感文件访问控制、HTTPS强制等)

项目结构

本项目采用“单入口+路由分发”的模式:

  • Web根目录下的.htaccess负责将请求重写到统一的PHP入口或子应用入口
  • index.php为前台统一入口,负责初始化框架、解析语言前缀、分发路由并输出响应
  • config/config.php定义关键常量(如ADMIN_DIR、API_DIR、是否开启后台重写等),影响路由行为
  • _'/.api/.htaccess用于API子应用的独立重写策略(如需)
graph TB
Client["客户端浏览器"] --> Apache["Apache 服务器"]
Apache --> HTAccess[".htaccess<br/>URL重写规则"]
HTAccess --> Index["index.php<br/>前台统一入口"]
Index --> Router["路由分发"]
Router --> Front["前端控制器/业务逻辑"]
subgraph "子应用"
APIHt[".api/.htaccess"]
APIIndex["api/index.php"]
end
HTAccess --> APIHt
APIHt --> APIIndex

核心组件

  • URL重写与入口统一:通过.htaccess将前台、后台、API的请求统一转发到对应入口,屏蔽真实路径,实现伪静态。
  • 安全限制:对敏感扩展名进行拒绝访问;透传Authorization头以支持后端鉴权。
  • 路由与异常处理:index.php完成框架引导、语言前缀解析、路由分发与异常渲染。

架构总览

下图展示从HTTP请求到PHP响应的完整流程,包括重写阶段与入口处理阶段。

sequenceDiagram
participant C as "客户端"
participant A as "Apache"
participant R as ".htaccess 重写"
participant I as "index.php"
participant S as "路由/控制器"
C->>A : HTTP 请求
A->>R : 匹配重写规则
alt 静态资源命中
R-->>A : 直接返回静态文件
else 动态请求
R->>I : 重写至 index.php?route=...
I->>S : 解析语言前缀并分发路由
S-->>I : 生成响应对象
I-->>C : 发送响应HTML/JSON
end

详细组件分析

.htaccess 重写规则详解

  • 敏感文件保护:对bak/inc/lib/sh/tpl/lbi/dwt/pem等扩展名拒绝访问,防止源码泄露。
  • Authorization头透传:当存在Authorization头时,将其复制到环境变量供PHP读取,便于后端实现Basic Auth或Token校验。
  • 静态入口映射:将index.html映射到index.php,便于SEO与统一入口。
  • API路由重写:
    • /api/xxx -> api/index.php?route=xxx
    • /api -> api/index.php
  • 后台路由重写:
    • 优先处理/admin/service与/admin/service/xxx,避免与物理目录冲突
    • 其他/admin/* -> admin/index.php?route=...
    • /admin -> admin/index.php
  • 前台路由重写:
    • 非静态、非真实文件的请求统一重写为 index.php?route=...
flowchart TD
Start(["收到请求"]) --> CheckStatic{"是否静态资源?"}
CheckStatic --> |是| ServeStatic["直接返回静态文件"]
CheckStatic --> |否| PathMatch{"路径匹配"}
PathMatch --> |/api/*| ToAPI["重写至 api/index.php?route=..."]
PathMatch --> |/admin/*| ToAdmin["重写至 admin/index.php?route=..."]
PathMatch --> |其他| ToFront["重写至 index.php?route=..."]
ToAPI --> End(["结束"])
ToAdmin --> End
ToFront --> End
ServeStatic --> End

前台入口 index.php 的工作流

  • 设置框架路由委托,加载前端路由解析器
  • 解析语言前缀并写入Request,随后清理$_GET['route']
  • 执行Init引导、路由分发、响应发送
  • 捕获并重定向、业务异常、未捕获异常的统一处理与渲染
sequenceDiagram
participant H as "HTTP 请求"
participant I as "index.php"
participant B as "Init/Bootstrap"
participant RT as "Route/Router"
participant RSP as "Response"
H->>I : 进入前台入口
I->>B : 初始化框架
I->>RT : 分发路由
RT-->>I : 返回响应对象
I->>RSP : 发送响应并退出

配置项与重写开关

  • config/config.php中定义了ADMIN_DIR、API_DIR、MINIPROGRAM_DIR以及ADMIN_REWRITE等常量,影响后台路由与重写行为。
  • 若开启后台重写,需确保Apache允许.htaccess生效,并在虚拟主机中正确配置AllowOverride。

API子应用重写(可选)

  • _'/.api/.htaccess可用于API子应用的独立重写策略,例如将/api/*进一步细分或添加额外安全限制。
  • 若使用此文件,请确保父级.htaccess不会拦截该路径,或在必要时合并规则。

依赖关系分析

  • Apache模块依赖
    • mod_rewrite:必须启用,否则所有重写规则失效
    • mod_ssl:建议使用,配合虚拟主机配置HTTPS
    • mod_headers/mod_expires:用于设置缓存头与压缩
  • 应用内依赖
    • index.php依赖路由与Init引导
    • .htaccess依赖Apache重写引擎
    • config/config.php中的常量影响路由与目录结构
graph LR
Apache["Apache"] --> ModRewrite["mod_rewrite"]
Apache --> ModSSL["mod_ssl"]
Apache --> ModHeaders["mod_headers"]
Apache --> VHost["虚拟主机"]
VHost --> DocRoot["网站根目录"]
DocRoot --> HTAccess[".htaccess"]
HTAccess --> Index["index.php"]
Index --> Config["config/config.php"]

性能考虑

  • KeepAlive
    • 建议开启KeepAlive,合理设置KeepAliveTimeout与MaxKeepAliveRequests,减少TCP握手开销
  • 缓存头
    • 对静态资源(图片、CSS、JS)设置Cache-Control与Expires,提升重复访问性能
  • 压缩
    • 启用Gzip/Deflate压缩文本类资源,降低带宽占用
  • 重写性能
    • 将静态资源排除出重写判断(已在.htaccess中通过扩展名过滤),减少不必要的重写计算
  • 日志与监控
    • 合理配置访问日志与错误日志级别,结合APM或系统监控观察瓶颈

故障排查指南

  • 404或路由无效
    • 检查Apache是否启用mod_rewrite且AllowOverride All
    • 确认.htaccess位于网站根目录且被Apache读取
    • 核对.htaccess中的重写规则顺序与条件
  • 后台无法访问
    • 检查config/config.php中ADMIN_DIR是否与目录一致
    • 若开启后台重写,确认Apache允许重写并正确配置虚拟主机
  • 权限问题
    • 确认storage、images、theme等目录具备读写权限
  • 异常页面
    • 根据index.php中的异常处理逻辑,调试时可临时开启调试模式查看详细堆栈
    • 生产环境应关闭调试,返回友好错误或JSON错误

结论

通过.htaccess与index.php的配合,DouPHP实现了清晰的URL重写与统一入口分发。在生产环境中,建议:

  • 启用并正确配置mod_rewrite、mod_ssl等必要模块
  • 使用虚拟主机隔离多站点,分别配置域名、根目录与重写策略
  • 强化安全:禁用目录浏览、限制敏感文件访问、强制HTTPS
  • 优化性能:开启KeepAlive、设置缓存头、启用压缩
  • 建立完善的日志与监控机制,便于快速定位问题

附录

虚拟主机配置示例(HTTPS + 重写)

以下为概念性示例,实际参数按环境调整:

  • 监听端口443,启用SSL证书
  • DocumentRoot指向网站根目录
  • AllowOverride All以启用.htaccess
  • 开启必要的模块:rewrite、ssl、headers、expires
<VirtualHost *:443>
    ServerName www.example.com
    DocumentRoot "/path/to/webroot"
    SSLEngine on
    SSLCertificateFile "/path/to/cert.pem"
    SSLCertificateKeyFile "/path/to/key.pem"

    <Directory "/path/to/webroot">
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # 可选:强制HTTPS
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

常见Apache模块启用清单

  • mod_rewrite:启用URL重写
  • mod_ssl:启用HTTPS
  • mod_headers:设置响应头(如缓存、安全头)
  • mod_expires:设置过期时间
  • mod_deflate/gzip:启用压缩

安全加固要点

  • 禁止目录浏览:Options -Indexes
  • 限制敏感文件访问:已在.htaccess中对特定扩展名拒绝访问
  • 强制HTTPS:在虚拟主机或.htaccess中重定向HTTP到HTTPS
  • 安全响应头:X-Frame-Options、X-Content-Type-Options、Strict-Transport-Security等
添加日期:2026-10-05