composer 不提供 htaccess-protect 配置项,也不生成或管理 .htaccess 文件;正确防护 vendor 目录需将 public/ 设为 web 根目录,而非依赖任何 composer 配置。

直接说结论:Composer 本身不提供 htaccess-protect 配置项,也完全不生成或管理 .htaccess 文件——这是 Web 服务器(如 Apache)层面的防护,和 Composer 无关。
为什么 htaccess-protect 不是 Composer 的配置项
这个键名在官方文档、源码、composer.json Schema 中都不存在。它可能是某些老旧教程、第三方插件(比如早期 fxp/composer-asset-plugin)或自定义脚本里误传的字段,甚至是对 Laravel 或某些 CMS 安装脚本的误解。
- Composer 只负责下载、安装、自动加载依赖,不触碰 Web 服务器配置
-
.htaccess是 Apache 特有的文件,Nginx / Caddy / IIS 完全不认它 - vendor 目录暴露风险,本质是 Web 根目录设置错误,不是 Composer 没“开保护”
真正有效的 vendor 目录防护方式
防护目标只有一个:确保 vendor/(以及 composer.json、composer.lock 等)不在 Web 可访问路径下。这不是“加个开关”,而是部署结构问题。
- ✅ 正确做法:把
public/(或web/)设为 Web 服务器根目录,vendor/和应用代码放在其上级目录 - ❌ 错误做法:把整个项目根目录(含
vendor/)直接设为 Web 根目录 - 如果必须共存(极少见),才用
.htaccess拦截,但仅限 Apache 且需手动写规则,例如:RewriteRule ^vendor/ - [F,L]
- 注意:
.htaccess在子目录生效需 Apache 开启AllowOverride All,否则规则被忽略
常见错误现象与排查点
当你发现 https://yoursite.com/vendor/autoload.php 能直接访问并执行,说明防护已失效——这不是 Composer 配置漏了,而是部署出问题了。
- 检查 Web 服务器根目录实际指向哪?运行
php -r "echo getcwd();"对比$_SERVER['DOCUMENT_ROOT'] - 确认
vendor/是否真在 Web 可达路径下(用浏览器直接请求一个vendor/composer/installed.json就知道) - Apache 下有
.htaccess但没生效?看 error_log 是否报Invalid command 'RewriteRule'(mod_rewrite 未启用) - Laravel / Symfony 用户:别信“运行
composer install就自动保护”,它从不写或改.htaccess
最易被忽略的一点:很多 CI/CD 流程或一键部署脚本会把整个仓库克隆到 /var/www/html,却忘了把 Web 根目录切到 html/public —— 这才是绝大多数 “vendor 被暴露” 的真实原因,和 composer.json 里写什么都无关。










