PHP项目Apache下URL重写依赖.htaccess与mod_rewrite模块,需启用模块并设AllowOverride All;通用规则转发非文件/目录请求至index.php,也可配置具体路由、隐藏后缀或强制HTTPS。

PHP项目在Apache环境下实现URL重写,核心靠的是 .htaccess 文件配合 mod_rewrite 模块。它不改变PHP代码逻辑,只让访问地址更简洁、更友好。关键不是堆规则,而是理解每条指令的作用和常见组合方式。
基础启用与安全前提
所有规则生效前,必须满足两个硬性条件:
- Apache已启用
mod_rewrite模块(Linux常用a2enmod rewrite,Windows检查httpd.conf中LoadModule rewrite_module是否启用) - 对应目录的虚拟主机配置中,
AllowOverride必须设为All(不能是None或FileInfo等受限值) - 重启Apache后,.htaccess 才可能被读取
最通用的“全量转发”模板
适用于ThinkPHP、Laravel等框架或自建路由系统,把除真实文件/目录外的所有请求,统一交给 index.php 处理:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>
说明:
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
立即学习“PHP免费学习笔记(深入)”;
-
RewriteBase /:指定重写基准路径,多用于子目录部署(如网站在/myapp/下,则改为RewriteBase /myapp/) -
!-f和!-d:跳过真实存在的文件(如logo.png)和目录(如/css/),避免静态资源被错误转发 -
index.php?/$1:将路径作为查询参数传入,PHP中可用$_SERVER['QUERY_STRING']或解析$_SERVER['REQUEST_URI']获取原始路径
按需匹配的具体路由规则
适合轻量项目或单页模块,直接映射固定结构:
- 用户页:
RewriteRule ^user/([0-9]+)/?$ user.php?id=$1 [L]→ 访问/user/123实际执行user.php?id=123 - 文章页(含标题):
RewriteRule ^post/([0-9]+)/([a-zA-Z0-9_-]+)$ post.php?id=$1&slug=$2 [L] - 隐藏 .php 后缀:
RewriteCond %{REQUEST_FILENAME}.php -f+RewriteRule ^(.+)$ $1.php [L] - 强制 HTTPS + www:
RewriteCond %{HTTPS} off [OR]+RewriteCond %{HTTP_HOST} !^www\. [NC]+RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
调试与避坑要点
规则写错容易导致500错误或无限重定向,建议:
- 每次只加一条规则,测试通过再叠加
- 开启Apache错误日志(
ErrorLog),查看具体哪行报错 - 用
[R=301]测试跳转是否符合预期,确认后再换[L]做内部转发 - 注意正则贪婪性:用
^article/(\d+)$比^article/(.*)$更安全,防止误匹配 - 静态资源路径出问题?检查是否漏了
!-f判断,或前端用了相对路径(建议用<base href="/">统一基准)


















