directadmin默认禁用.htaccess解析,因虚拟主机配置中allowoverride none,须通过“custom httpd configurations”手动注入directory指令与rewrite规则,并确保thinkphp开启url_route_on及路径配置匹配。

DirectAdmin 默认不支持 .htaccess 自动解析,ThinkPHP 的伪静态规则必须手动注入到 Apache 的虚拟主机配置中,否则 RewriteRule 会完全失效。
为什么 DirectAdmin 下 .htaccess 不生效
DirectAdmin 使用自动生成的 httpd.conf 配置,对每个域名单独生成 <virtualhost></virtualhost> 块,并默认设置 AllowOverride None。即使你上传了正确的 .htaccess 文件,Apache 也会直接忽略其中的 RewriteEngine On 和所有重写规则。
- 检查实际生效的配置:运行
cat /usr/local/directadmin/data/users/USERNAME/httpd.conf | grep -A5 -B5 AllowOverride,大概率看到的是AllowOverride None - DirectAdmin 的“Custom HTTPD Configurations”功能才是唯一可控入口,不能依赖面板里的“Rewrite Rules”文本框(那个只对 Nginx 模式有效)
- 改错位置会导致整个站点 500 错误,尤其是把规则写进全局
httpd.conf而非用户级配置时
在 DirectAdmin 中正确启用 ThinkPHP 伪静态的步骤
必须通过 DirectAdmin 后台的「Custom HTTPD Configurations」插入 Apache 指令,且仅作用于当前域名:
- 进入 DA 后台 → “Custom HTTPD Configurations” → 选择对应域名 → 在 “Apache Custom Configuration” 文本框中粘贴以下内容(注意替换
yourdomain.com为实际域名):
<directory>
Options +FollowSymLinks
AllowOverride All
Require all granted
</directory><ifmodule mod_rewrite.c><directory>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</directory></ifmodule>
- 保存后执行
systemctl restart httpd或service httpd restart -
USERNAME必须替换成实际的 DA 用户名,路径错误会导致 403 或规则不触发 - 不要在
public_html下再放.htaccess—— 此时它已冗余,反而可能因权限或语法问题干扰主配置
ThinkPHP 框架端必须同步开启的配置项
服务器层配置只是第一步,ThinkPHP 自身也必须明确启用路由和 PATH_INFO 支持,否则 index.php/$1 这种格式无法被正确解析:
- 确认
config/app.php中存在并启用:'url_route_on' => true,'url_common_param' => false,'url_html_suffix' => '',(除非你真要加.html后缀) - 确保
public/index.php入口文件没有被修改过 PATH_INFO 获取逻辑;标准 TP6 入口已兼容,但若用过旧版迁移或自定义入口,需检查是否仍用$_SERVER['PATH_INFO']而非$_SERVER['ORIG_PATH_INFO'] - TP5.1+ 默认关闭
url_route_must,但若你在路由定义里用了Route::miss()或闭包路由,务必测试 404 是否被正确捕获,因为 DirectAdmin 下 PATH_INFO 传递异常时容易静默失败
常见 500/404 错误排查点
规则写对了、框架也开了,但访问仍报错,大概率卡在这几个环节:
- Apache 模块未启用:
httpd -M | grep rewrite必须输出rewrite_module (shared),否则<ifmodule mod_rewrite.c></ifmodule>块整个被跳过 - 路径中多写了
/public:DA 默认把域名根目录指向public_html,而 ThinkPHP 项目结构常把public当 Web 入口,此时应把public目录内容(含index.php)直接放在public_html下,而不是把整个 TP 项目放进去 -
index.php权限不足:DA 环境下常见index.php是 644,但若 PHP 运行在 suPHP 或 php-fpm 模式下,可能要求至少 755,否则重写后无法执行 - URL_MODEL 设置冲突:TP6 已废弃
URL_MODEL配置,但若 config 中残留该字段且值为 0 或 1,会强制走 QUERY_STRING 模式,导致伪静态路由完全不匹配
最易被忽略的是路径层级与入口位置的错配——DirectAdmin 不像宝塔那样自动识别 TP 的 public 目录,一切都要靠你手动对齐物理路径和逻辑路由起点。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











