无虚拟主机权限时如何通过htaccess配置Bonfire Codeigniter站点根目录
无虚拟主机权限时通过.htaccess实现Bonfire站点正确指向的配置方案
生效逻辑说明
当前服务器Web根目录直接指向Bonfire项目外层根目录(包含app、public、vendor、writable等核心文件夹),无法修改Apache配置将根目录指到public子目录时,核心思路是在项目根目录的.htaccess中拦截所有进站请求,透明转发到public目录的站点运行层,同时阻断对敏感资源的直接访问,避免安全风险。
之前单独添加RewriteBase public/规则不生效的原因是:该指令仅对当前所在目录(通常是public目录)内的重写规则的路径解析生效,未经过路径转发的请求根本不会触达public目录下的.htaccess文件,自然无法适配站点运行。
分目录配置规则
1. 项目根目录(即当前服务器Web根指向的外层目录)下新增.htaccess文件
将以下规则写入项目根目录的.htaccess,实现请求转发与安全拦截:
RewriteEngine On # 拦截所有对非公开敏感目录的直接访问,返回403禁止状态 RewriteRule ^(app|vendor|writable|tests)/ - [F,L] # 拦截所有对根目录下敏感文件的直接访问 RewriteRule ^(\.env|composer\.(json|lock)|.htaccess|phpunit\.xml|spark)$ - [F,L] # 匹配public目录下存在的真实文件/目录,直接指向对应public路径 RewriteCond %{DOCUMENT_ROOT}/public%{REQUEST_URI} -f [OR] RewriteCond %{DOCUMENT_ROOT}/public%{REQUEST_URI} -d RewriteRule ^(.*)$ /public/$1 [L] # 其余所有请求统一转发到public目录下的前端控制器 RewriteRule ^(.*)$ public/index.php?/$1 [L,QSA]
2. public目录下的原有.htaccess规则调整
public目录下Bonfire自带的.htaccess无需额外添加RewriteBase public/,保留原有核心重写规则即可,仅需确认规则未开启强制跳出到public路径的逻辑,典型的有效配置如下:
RewriteEngine On # 将请求解析到index.php前端控制器 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
配置注意事项
- 需确认服务器Apache已开启
mod_rewrite模块,否则所有重写规则无法生效 - 规则中
F标记代表返回403禁止访问,不要随意删除敏感资源拦截规则,否则会造成源码、数据库凭证等信息泄露 - 配置完成后不要在URL中手动暴露
/public路径,否则会被判定为真实目录访问,无法经过前端控制器的权限校验
配置验证要点
- 直接访问站点根域名,可正常加载站点首页,URL无额外路径跳转
- 尝试直接访问站点下的
.env、composer.json等敏感文件,可正常返回403状态 - 站点的静态资源、后台路由、API接口均可正常访问,无404或路径解析错误
内容的提问来源于stack exchange,提问作者Esteban Solorzano
相关产品推荐
相关产品推荐

