Ubuntu 20.04下curl上传文件到Apache报405 Method Not Allowed错误
问题根因
配置不生效、持续返回405有三个核心问题:
- 仅配置
AllowMethods只会声明允许的HTTP方法,Apache默认没有内置PUT请求的处理逻辑,必须启用对应模块处理文件写入操作,单纯开方法权限没有实际作用 <Location>指令匹配的是URL路径而非本地磁盘路径,原配置里写的<Location /var/www/example/html>完全匹配不到https://example.com/web/的请求路径,规则根本没命中- 配置存在语法和冗余问题:
Options行末尾多了多余的.,Allow from all是Apache 2.2版本的旧访问控制语法,和2.4版本的Require all granted重复,另外Alias和目录规则写在VirtualHost块外部,也可能被虚拟主机内的默认规则覆盖。
修复步骤
1. 启用依赖模块
Apache处理PUT文件上传需要依赖WebDAV相关模块,执行命令启用:
sudo a2enmod dav dav_fs
2. 修正站点配置
编辑/etc/apache2/sites-enabled/example.com-ssl.conf,把Alias、目录权限相关配置全部移到<VirtualHost *:443>块内部,替换为以下内容,删掉原来写在VirtualHost外面的配置和错误的Location块:
Alias /web "/var/www/example/html" <Directory "/var/www/example/html"> Options Indexes MultiViews FollowSymLinks Includes ExecCGI AllowOverride None Require all granted # 开启DAV写入支持,真正处理PUT请求 DAV On # 限制允许的请求方法 <LimitExcept GET POST OPTIONS HEAD PUT> Require all denied </LimitExcept> </Directory>
3. 配置目录写入权限
Ubuntu下Apache默认运行用户是www-data,需要给上传目录开放写入权限:
sudo chown -R www-data:www-data /var/www/example/html sudo chmod 755 /var/www/example/html
4. 校验配置并重载服务
先执行配置语法检查,避免配置错误导致服务异常:
sudo apache2ctl configtest
返回Syntax OK后重载服务生效:
sudo systemctl reload apache2
验证测试
重新执行curl命令测试上传,建议在URL末尾明确指定上传后的目标文件名,避免目录路径解析问题:
curl -v --insecure -T http-100M.dat https://example.com/web/http-100M.dat
注意:如果需要开放匿名上传,建议额外配置上传目录的执行权限限制,避免上传可执行脚本带来安全风险。
内容的提问来源于stack exchange,提问作者MikeX
相关产品推荐
相关产品推荐

