xampp 8.1.25 默认拒绝非 htdocs 目录的 php 访问,报 403 是因 apache 权限策略未显式配置 块并写入 require all granted;改 documentroot 无效,因其仅影响未匹配虚拟主机的请求,而一旦定义 ,权限即由其内 控制。

直接说结论:XAMPP 8.1.25 默认拒绝非 htdocs 目录的 PHP 访问,报 403 Forbidden 不是文件或路径问题,而是 Apache 的权限策略在起作用——必须显式配置 <directory></directory> 块并写入 Require all granted。
为什么改了 DocumentRoot 还是 403?
因为 XAMPP 8.1.25(基于 Apache 2.4+)已弃用旧式 Order allow,deny,只认新授权语法;而 DocumentRoot 是全局指令,仅影响「未匹配到任何虚拟主机」的请求。一旦你定义了 <virtualhost></virtualhost>(哪怕只配了一个),所有请求就走该块内的 <directory></directory> 权限控制——主配置里的 DocumentRoot 设置完全不生效。
常见错误操作:
- 只改
httpd.conf里的DocumentRoot "/my/project",没加对应<directory></directory>块 - 写了
<directory></directory>,但里面还是用Allow from all(Apache 2.4 已忽略该指令) - 路径含中文、空格或符号(如
C:my project),Apache 启动时静默跳过该配置,httpd -t却不报错
如何正确配置虚拟目录访问 PHP?
推荐统一使用 httpd-vhosts.conf 管理,避免污染主配置。步骤如下:
- 确认
httpd.conf中这两行已取消注释:LoadModule vhost_alias_module modules/mod_vhost_alias.so和Include "conf/extra/httpd-vhosts.conf" - 编辑
apache/conf/extra/httpd-vhosts.conf,追加完整虚拟主机块(注意端口和路径):
<virtualhost>
DocumentRoot "C:/myproject"
ServerName local.test
<directory>
Require all granted
Options Indexes FollowSymLinks
AllowOverride All
</directory></virtualhost>
关键点:
-
Require all granted是唯一有效的放行指令,缺它必 403 - Windows 路径用正斜杠
/或双反斜杠\,单反斜杠会解析失败 -
AllowOverride All是为了支持项目内.htaccess(如 Laravel 的重写规则) - 路径必须真实存在,且 Apache 进程有读取权限(Windows 下一般无需手动设权限,但杀毒软件可能拦截)
访问时仍提示 “New XAMPP security concept” 怎么办?
这是 XAMPP 8.x 新增的安全层,独立于 Apache 主配置,在 httpd-xampp.conf 中硬编码限制。它默认只允许 localhost 和 127.0.0.1,连 192.168.x.x 都会被拦。
解决方法:编辑 apache/conf/extra/httpd-xampp.conf,搜索 Require local,在其后添加你需要的访问来源,例如:
- 允许局域网所有设备:
Require ip 192.168 - 允许本机所有 IPv6 地址:
Require ip ::1 - 允许任意地址(仅开发环境):
Require all granted(不建议放生产)
改完必须重启 Apache,仅重载配置(httpd -k reload)不会生效。
调试时容易被忽略的三个点
一是 httpd -t 必须运行——拼错 这种低级错误会导致整段配置失效,但 Apache 不报错也不加载;二是 Windows 下路径权限看似无关,实则某些安全软件(如火绒、Defender 实时防护)会阻止 Apache 打开非标准路径下的文件,临时禁用可验证;三是浏览器缓存 Host 头或 301 重定向,换隐身窗口或清 DNS 缓存(ipconfig /flushdns)再试。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











