Hostwinds 博客
寻找结果为:
每个HTTP状态代码都讲述了客户端(例如Web浏览器)和服务器之间发生的事情的故事。有些故事很简单;200意味着成功,404表示该页面不存在。但是,当您看到405方法不允许时,故事会更有趣。
让我们分解405错误的含义,为什么会发生以及如何对其进行故障排除
当客户端(例如您的浏览器或API工具)使用HTTP方法提供服务器不允许该资源的http方法时,不允许响应的405方法发生。
例如:
重要的细节是您要尝试到的页面存在,但是服务器不允许与之交互的请求方法。
405错误并不总是有一个明显的原因。它可以来自提出请求的方式,如何配置服务器,甚至来自到位的额外安全层。这是最常见的情况会触发它:
设置服务器上的每个资源都可以接受某些HTTP方法。例如:
一个常见的情况是开发人员发送 邮政 要求仅旨在处理的URL 得到。服务器识别资源,但是由于不支持该方法,它以405响应。
这是最常见的原因之一,尤其是在使用与Web服务交互的表单,API或脚本时。
诸如Apache,Nginx和IIS之类的Web服务器可以控制允许使用HTTP方法的管理员。配置指令,例如Apache的限制或NGINX的limit_except可以明确阻止某些动词。
例如:
更改后通常会发生这种情况 .htaccess 文件,服务器块或IIS请求过滤设置。即使是小型错别字或被忽视的指令也可能导致方法无意间阻止。
API的设计具有严格的方法规则。在静止的API中,不同的HTTP动词通常对应于特定动作:
如果开发人员用错误的方法调用端点,例如发送 放 到只允许的URL 邮政,服务器以405响应。
这是有意的,因为API旨在强制执行一致的相互作用模式。例如,Github的API不会让您 删除 通过错误的方法调用错误的存储库,需要正确的动词,否则您将获得405响应。
Web表单和JavaScript(AJAX)请求是405个错误的另一个常见来源:
由于浏览器会自动处理表单和AJAX提交,即使是对请求的编码方式而言,与服务器期望如何触发此错误的不匹配。
初学者在学习在PHP中设置表单或使用拨打API调用的前端框架时经常会遇到这一点。
即使正确配置了服务器,安全层也可以介入并阻止请求。示例包括:
在这些情况下,服务器本身可能支持该方法,但是请求在到达应用程序之前就会截获。这通常会导致混乱,因为日志可能会显示服务器"拒绝"该方法,而实际上它是进行过滤的安全层。
乍一看,可能会误认为405的错误 其他客户和服务器错误。但是细节很重要,并且了解差异将有助于您正确诊断它。
诊断405可能很棘手,因为服务器确认存在资源,但是拒绝以发送方式处理该请求。要追踪根本原因,它有助于逐步解决问题。
当服务器返回405时,响应应包括一个允许标头列表,支持哪些方法用于该资源。这是服务器说:"您不能做到这一点,但这就是您可以做的。"
例:
HTTP/1.1 405 Method Not Allowed
Allow: GET, POST
日志通常是发现原因的最快方法,因为它们通常会直接解释为什么拒绝该请求并确认这不是更深的连接问题。
日志可能显示:类似:
client sent an unsupported method (PUT) to /index.php
类似的工具 卷曲 要么 邮差 对于确认哪种方法实际上有效的是无价的。测试端点以这种方式排除猜测工作,并使您可以清楚地了解服务器如何响应不同的请求。
使用卷发:
curl -i -X GET https://example.com/resource
curl -i -X POST https://example.com/resource
curl -i -X PUT https://example.com/resource
Postman提供了一个视觉接口,您可以在其中切换请求方法并立即看到响应,从而使其更友好。
如果服务器允许该方法,但是您仍获得405,则可能出现在应用程序代码中。
表格: 确保<形式>元素的方法属性匹配服务器期望的内容。例子:
<form action="/submit" method="post">
ajax/fetch: 验证在JavaScript中正确设置请求方法:
fetch('/api/data', {
method: 'POST'
})
注意: 此步骤通常是初学者被绊倒的地方,将数据发送到正确的端点,但动词错误。
如果标题和代码看起来都不错,则问题可能是服务器级限制。管理员通常出于安全原因阻止方法,但是如果停止合法请求,则需要调整这些设置。
阿帕奇: 在.htaccess或Main Config中查找限制或LimiteXcept指令。例子:
<Limit GET POST>
Require all granted
</Limit>
Nginx: 检查limit_except指令:
location /api/ {
limit_except GET POST {
deny all;
}
}
修复405错误取决于您的网站或应用程序正在运行的平台或环境。由于每个服务器类型和内容管理系统都以不同的方式处理HTTP请求,因此解决方案可能会有所不同。让我们浏览一些常见的平台,浏览可以采取的步骤以查看配置并调整设置,以便允许使用正确的HTTP方法。
1.提出错误并读取标题
curl -i -X PUT https://example.com/path
2。如果看到允许,请调整您的请求/客户端以匹配。如果不这样做,请继续下面。
1.Locate配置
2。备份您将编辑的文件
sudo cp /etc/apache2/sites-available/site.conf /etc/apache2/sites-available/site.conf.bak
3。搜索方法限制
# Example: only GET/POST allowed here
<LimitExcept GET POST>
Require all denied
</LimitExcept>
4。添加所需的方法或删除限制性块
<LimitExcept GET POST PUT>
Require all denied
</LimitExcept>
5。验证和重新加载
sudo apachectl -t
sudo systemctl reload apache2 # or: sudo systemctl reload httpd
6。用卷发重新测试
curl -i -X PUT https://example.com/path
7。如果仍然被阻塞,请检查安全层(例如MOD_SECURITY审核日志)和VirtualHost优先级。
1.打开网站的服务器块
2。备份文件
sudo cp /etc/nginx/sites-available/site.conf /etc/nginx/sites-available/site.conf.bak
3。寻找 limit_except 块
location /api/ {
limit_except GET POST {
deny all;
}
}
4。添加所需的方法或删除块,如果不需要
location /api/ {
limit_except GET POST PUT {
allow all;
}
}
5。测试和重新加载
sudo nginx -t
sudo systemctl reload nginx
6。用卷发重新测试
curl -i -X PUT https://example.com/api/resource
7。如果您代理App Server,则确认上游也允许该方法。
<system.webServer>
<handlers> ... </handlers>
<security>
<requestFiltering>
<verbs>
<!-- Remove Deny for verbs you need -->
<add verb="PUT" allowed="true" />
</verbs>
</requestFiltering>
</security>
</system.webServer>
6。回收应用程序池或重新启动站点。
7。用卷发/邮递员进行重新测试。
1.确认合同
2,探测终点
# Discover allowed methods (if supported)
curl -i -X OPTIONS https://api.example.com/v1/items/123
# Then try the method you intend
curl -i -X PATCH https://api.example.com/v1/items/123
3.修复客户端或服务器(示例)
app.post('/items', createItem);
app.put('/items/:id', updateItem);
// If PUT not defined, add it—or switch your client to POST if that's the design.
@app.route('/items/<id>', methods=['GET','POST','PUT','DELETE'])
def item(id): ...
4。设置一个有用的405,使用允许标头(服务器端)
5。如果以API网关/WAF为前面,请查看方法过滤规则。
6。用邮递员/卷曲进行重新测试,并确认预期的2xx/3xx/4xx流。
在出现405的错误只是挑战的一半时,请修复405误差 - 从长远来看可以节省时间和挫败感的原因。通过在开发和配置期间进行正确的实践,您可以减少用户或应用程序的机会,以无支持的方法。这是几种有助于防止405个错误的方法。
在编写表单,脚本或API调用时,您只使用服务器允许的HTTP方法进行双检查。例如,如果您的服务器接受提交数据的帖子,请确保您不会意外使用或放置。开发早期验证方法还有助于捕获错误,然后才能达到生产。许多框架使您可以直接在路由或控制器中定义允许的方法,从而更容易执行正确的用法。
服务器通常在其配置文件中定义了方法限制(例如.htaccess,nginx.conf或API网关设置)。记录支持哪些方法的记录使开发人员和管理员都更容易理解限制。该文档在较大的团队或长期项目中特别有用,否则服务器规则会随着时间的流逝而丢失或遗忘。
即使经过仔细的计划,不受支持的方法请求也可能会通过。这就是为什么在405发生时提供明显的错误消息很有用的原因。自定义响应而不是模糊的"方法",以便用户或开发人员了解出了什么问题以及如何纠正响应,例如,通过在响应标头中包含允许方法的列表或在文档中建议正确的方法。
如果您要构建API,坚持休息最佳实践和HTTP标准,使客户更容易知道期望什么。例如,如果您设计了更新资源的终点,请始终使用或始终使用补丁。这种可预测性降低了发送未支撑方法的风险,并帮助外部开发人员正确与您的API互动。
405方法不允许错误告诉您服务器知道资源的存在,但是它不允许您尝试过的方法。
关键要点: 检查允许标头,查看日志,并确保您的代码和服务器规则匹配您要支持的方法。
撰写者 Hostwinds Team / 八月 27, 2025