Apache RewriteRule 将所有非静态资源请求内部重写至 index.php,实现前端控制器模式,使 PHP 框架统一处理路由;需启用 mod_rewrite、设置 RewriteEngine On,并用 RewriteCond 排除真实文件和目录,再通过 RewriteRule ^(.*)$ index.php [L] 完成转发。
apache 通过 rewriterule 将所有请求转发至入口文件(如 index.php),本质是启用“前端控制器”模式,让 php 框架(如 laravel、symfony)或自定义路由统一处理所有路径。这不需要重定向,而是内部重写,浏览器地址栏不变。
启用重写引擎并设置基础规则
确保已加载 mod_rewrite 模块,并在虚拟主机或 .htaccess 中开启重写:
- 确认
LoadModule rewrite_module modules/mod_rewrite.so在httpd.conf中未被注释 - 在配置中添加:
RewriteEngine On - 若用
.htaccess,还需确保对应目录的AllowOverride设置为All或至少包含FileInfo
匹配非静态资源的请求
直接把所有请求都转给 index.php 会干扰图片、CSS、JS 等静态文件访问,因此需先排除真实存在的文件和目录:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
RewriteCond %{REQUEST_FILENAME} !-f:跳过已存在的真实文件(如style.css) -
RewriteCond %{REQUEST_FILENAME} !-d:跳过已存在的真实目录(如/uploads/) - 之后再用规则捕获全部剩余路径:
RewriteRule ^(.*)$ index.php [L]
适配不同上下文的路径写法
规则行为受配置位置影响,注意开头斜杠:
- 在
VirtualHost或httpd.conf中:RewriteRule ^/.*$ /index.php [L](Pattern 带/,Target 也建议带/) - 在
.htaccess文件中:RewriteRule ^(.*)$ index.php [L](Pattern 不带开头/,Target 是相对路径) - 若入口文件不在根目录(如
/app/index.php),Target 写成app/index.php,并确保RewriteBase /app/已设置
保留原始路径供 PHP 解析
PHP 需要知道原始请求路径(如 /user/profile),不能只看到 index.php。可通过 QSA 标志透传查询参数,并将路径作为参数传入:
-
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]→ 在$_GET['url']中获取路径 - 更标准做法是使用
PATH_INFO:RewriteRule ^(.*)$ index.php/$1 [L],然后在 PHP 中读$_SERVER['PATH_INFO'] - 部分框架(如 Laravel)依赖
$_SERVER['REQUEST_URI'],该变量默认可用,无需额外传递

















