Hostwinds 博客

寻找结果为:


405错误解释了:原因,修复和预防技巧 特色图片

405错误解释了:原因,修复和预防技巧

通过: Hostwinds Team  /  八月 27, 2025


每个HTTP状态代码都讲述了客户端(例如Web浏览器)和服务器之间发生的事情的故事。有些故事很简单;200意味着成功,404表示该页面不存在。但是,当您看到405方法不允许时,故事会更有趣。

让我们分解405错误的含义,为什么会发生以及如何对其进行故障排除

405状态代码意味着什么

当客户端(例如您的浏览器或API工具)使用HTTP方法提供服务器不允许该资源的http方法时,不允许响应的405方法发生。

例如:

  • 表单提交发送 邮政 请求,但服务器仅接受 得到 对于那个URL。
  • 脚本发送 请求,但端点被配置为仅允许 邮政删除.

重要的细节是您要尝试到的页面存在,但是服务器不允许与之交互的请求方法。

什么可能导致405错误

405错误并不总是有一个明显的原因。它可以来自提出请求的方式,如何配置服务器,甚至来自到位的额外安全层。这是最常见的情况会触发它:

1。错误的http方法

设置服务器上的每个资源都可以接受某些HTTP方法。例如:

  • 产品页面可能允许 得到 (获取细节),但拒绝 邮政 (提交数据)。
  • API端点可能允许 邮政 要创建一个新项目,但如果您尝试的话,请返回405 删除.

一个常见的情况是开发人员发送 邮政 要求仅旨在处理的URL 得到。服务器识别资源,但是由于不支持该方法,它以405响应。

这是最常见的原因之一,尤其是在使用与Web服务交互的表单,API或脚本时。

2。配置错误的服务器规则

诸如Apache,Nginx和IIS之类的Web服务器可以控制允许使用HTTP方法的管理员。配置指令,例如Apache的限制或NGINX的limit_except可以明确阻止某些动词。

例如:

  • 服务器管理员可能会配置站点以仅允许 得到邮政,阻止 删除 用于安全。
  • 如果规则太严格(或错误地写),则可以用405拒绝合法请求。

更改后通常会发生这种情况 .htaccess 文件,服务器块或IIS请求过滤设置。即使是小型错别字或被忽视的指令也可能导致方法无意间阻止。

3。API限制

API的设计具有严格的方法规则。在静止的API中,不同的HTTP动词通常对应于特定动作:

  • 得到 →检索数据
  • 邮政 →创建新数据
  • 放/补丁 →更新现有数据
  • 删除 →删除数据

如果开发人员用错误的方法调用端点,例如发送 到只允许的URL 邮政,服务器以405响应。

这是有意的,因为API旨在强制执行一致的相互作用模式。例如,Github的API不会让您 删除 通过错误的方法调用错误的存储库,需要正确的动词,否则您将获得405响应。

4。错误形式或AJAX设置

Web表单和JavaScript(AJAX)请求是405个错误的另一个常见来源:

  • 表格可能具有 方法=" post" 属性,但服务器仅允许 得到 在那个网址上。
  • JavaScript的 拿来() 要么 xmlhttprequest 当后端仅支持发布时,可以编码以发送PUT请求。

由于浏览器会自动处理表单和AJAX提交,即使是对请求的编码方式而言,与服务器期望如何触发此错误的不匹配。

初学者在学习在PHP中设置表单或使用拨打API调用的前端框架时经常会遇到这一点。

5。安全工具

即使正确配置了服务器,安全层也可以介入并阻止请求。示例包括:

  • Web应用程序防火墙(WAFS): 这些监视传入的流量,并可能拒绝诸如PUT,删除或跟踪之类的方法以降低攻击风险。
  • 安全插件: 在WordPress之类的平台中,某些插件禁用某些范围内的某些方法,以防止未经授权的请求。

在这些情况下,服务器本身可能支持该方法,但是请求在到达应用程序之前就会截获。这通常会导致混乱,因为日志可能会显示服务器"拒绝"该方法,而实际上它是进行过滤的安全层。

405与类似状态代码有何不同

乍一看,可能会误认为405的错误 其他客户和服务器错误。但是细节很重要,并且了解差异将有助于您正确诊断它。

404找不到

  • 它的含义: 服务器找不到您要求的资源。
  • 例: 您尝试访问example.com/page.html,但该页面根本不存在。
  • 与405的关键区别: 有了404,问题本身就不在那里,而使用405,资源存在 - 您只是使用错误的方法与之互动。

403禁止

  • 它的含义: 资源存在,但是服务器阻止您访问它。
  • 例: 您可能会在没有适当权限的情况下尝试查看私人目录。
  • 与405的关键区别: 403是关于访问权限的,而405是关于方法限制的。

501未实施

  • 它的含义: 对于任何资源,该服务器根本无法识别或支持HTTP方法。
  • 例: 无论您尝试哪种资源,不支持补丁请求的服务器都会丢弃此错误。
  • 与405的关键区别: 501适用于整个服务器,而405仅适用于特定资源。

诊断405错误

诊断405可能很棘手,因为服务器确认存在资源,但是拒绝以发送方式处理该请求。要追踪根本原因,它有助于逐步解决问题。

1。检查允许的方法

当服务器返回405时,响应应包括一个允许标头列表,支持哪些方法用于该资源。这是服务器说:"您不能做到这一点,但这就是您可以做的。"

例:

HTTP/1.1 405 Method Not Allowed
Allow: GET, POST
  • 如果您尝试放置,则此响应告诉您只有获得和发布是有效的。
  • 您可以使用浏览器开发人员工具(网络选项卡)或诸如Postman之类的工具看到这一点。
  • 在调试工作流程中自动化标头检查可以快速突出显示多个端点的未对准方法。

2。查看服务器日志

日志通常是发现原因的最快方法,因为它们通常会直接解释为什么拒绝该请求并确认这不是更深的连接问题。

  • 阿帕奇: 检查 error_log 文件,通常在 /var/log/apache2/ 要么 /var/log/httpd/.
  • Nginx: 审查 error.log 和Access.log,通常在 /var/log/nginx/.
  • IIS: 打开活动查看器或检查IIS日志文件 %systemDrive%\ inetpub \ logs \ logfiles \.

日志可能显示:类似:

client sent an unsupported method (PUT) to /index.php

3。测试端点

类似的工具 卷曲 要么 邮差 对于确认哪种方法实际上有效的是无价的。测试端点以这种方式排除猜测工作,并使您可以清楚地了解服务器如何响应不同的请求。

使用卷发:

curl -i -X GET https://example.com/resource
curl -i -X POST https://example.com/resource
curl -i -X PUT https://example.com/resource
  • 如果获得成功,但以405的比例将失败的失败命名,那么您已经确定了不匹配。

Postman提供了一个视觉接口,您可以在其中切换请求方法并立即看到响应,从而使其更友好。

4。检查您的代码

如果服务器允许该方法,但是您仍获得405,则可能出现在应用程序代码中。

表格: 确保<形式>元素的方法属性匹配服务器期望的内容。例子:

 <form action="/submit" method="post">

ajax/fetch: 验证在JavaScript中正确设置请求方法:

 fetch('/api/data', {
  method: 'POST'
})
  • 框架:如果您不明确设置它们,则某些框架(例如Angular,React或Django)可能默认为某些方法。仔细检查不匹配的客户端和服务器端代码。

注意: 此步骤通常是初学者被绊倒的地方,将数据发送到正确的端点,但动词错误。

5。检查服务器配置

如果标题和代码看起来都不错,则问题可能是服务器级限制。管理员通常出于安全原因阻止方法,但是如果停止合法请求,则需要调整这些设置。

阿帕奇: 在.htaccess或Main Config中查找限制或LimiteXcept指令。例子:

 <Limit GET POST>
   Require all granted
</Limit>
  • 如果这里丢失了PUT,则任何PUT请求都将返回405。

Nginx: 检查limit_except指令:

 location /api/ {
   limit_except GET POST {
      deny all;
   }
}
  • 这将拒绝除了获得和发布以外的其他方法。
  • IIS:打开IIS管理器,转到请求过滤,然后查看HTTP动词选项卡。诸如put或delete之类的动词将出现在这里。

通过平台/环境解决405错误

修复405错误取决于您的网站或应用程序正在运行的平台或环境。由于每个服务器类型和内容管理系统都以不同的方式处理HTTP请求,因此解决方案可能会有所不同。让我们浏览一些常见的平台,浏览可以采取的步骤以查看配置并调整设置,以便允许使用正确的HTTP方法。

快速预先检查(适用于全部)

1.提出错误并读取标题

curl -i -X PUT https://example.com/path

2。如果看到允许,请调整您的请求/客户端以匹配。如果不这样做,请继续下面。

阿帕奇

1.Locate配置

  • 网站配置: /Etc/apache2/sites-available/* .conf 要么 /Etc/httpd/conf.d/gon.conf
  • 人数规则:项目 .htaccess

2。备份您将编辑的文件

sudo cp /etc/apache2/sites-available/site.conf /etc/apache2/sites-available/site.conf.bak

3。搜索方法限制

  • 寻找 <限制...>, <limitexcept ...>, 要么 重写 阻止动词的模式。
# 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优先级。

Nginx的

1.打开网站的服务器块

  • 常见路径: /etc/nginx/stites-available/,/etc/nginx/conf.d/j.conf

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,则确认上游也允许该方法。

IIS(Windows Server)

  1. 打开 IIS经理 →选择网站。
  2. 请求过滤→HTTP动词.
  3. 删除所需动词的任何拒绝条目(例如,放置,删除),如果您的策略需要明确允许,请添加允许条目。
  4. 检查一下 处理程序映射: 如果 WebDav 已安装和拦截您需要的动词,删除或禁用该站点的WebDAV处理程序(或卸载WebDav(如果不需要))。
  5. 如果存在,请查看Web.config:
<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。用卷发/邮递员进行重新测试。

WordPress和其他CMS平台

  1. 重新保存永久链接
    • 设置→永久链接→保存更改 (此刷新重写规则)。
  2. 测试插件冲突
    • 暂时禁用所有插件。
    • 一一重新启用以找到罪犯(安全,REST/API,缓存和防火墙插件是常见原因)。
  3. 检查平台生成的规则
    • 阿帕奇: .htaccess部分由插件添加。
    • Nginx: 添加了用于缓存/安全性的服务器块,其中可能包含limit_except或方法过滤器。
  4. 如果使用CMS REST API,请在端点上验证接受的方法,并相应地调整客户端或路由配置。
  5. 每次更改后,重新测试关键操作(表格,登录,管理员操作)。

API(一般)

1.确认合同

  • 检查每个端点的允许方法和预期路径的API文档。

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.修复客户端或服务器(示例)

  • 客户端修复:发送该方法端点实际支持(例如,发布而不是put)。
  • express(node.js)
 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.
  • 烧瓶(Python)
 @app.route('/items/<id>', methods=['GET','POST','PUT','DELETE'])
def item(id): ...

4。设置一个有用的405,使用允许标头(服务器端)

  • 如果您的框架未自动设置,请添加标题列表允许的方法。

5。如果以API网关/WAF为前面,请查看方法过滤规则。

6。用邮递员/卷曲进行重新测试,并确认预期的2xx/3xx/4xx流。

修复后:快速验证列表

  • 该操作现在返回成功或正确的错误(不是405)。
  • 允许标头准确列出允许的方法。
  • 日志显示正常处理,而不是阻止动词。
  • 自动测试(如果有的话)涵盖了校正后的路径和方法。

预防将来405个错误

在出现405的错误只是挑战的一半时,请修复405误差 - 从长远来看可以节省时间和挫败感的原因。通过在开发和配置期间进行正确的实践,您可以减少用户或应用程序的机会,以无支持的方法。这是几种有助于防止405个错误的方法。

验证代码中的方法

在编写表单,脚本或API调用时,您只使用服务器允许的HTTP方法进行双检查。例如,如果您的服务器接受提交数据的帖子,请确保您不会意外使用或放置。开发早期验证方法还有助于捕获错误,然后才能达到生产。许多框架使您可以直接在路由或控制器中定义允许的方法,从而更容易执行正确的用法。

文档服务器规则

服务器通常在其配置文件中定义了方法限制(例如.htaccess,nginx.conf或API网关设置)。记录支持哪些方法的记录使开发人员和管理员都更容易理解限制。该文档在较大的团队或长期项目中特别有用,否则服务器规则会随着时间的流逝而丢失或遗忘。

错误处理

即使经过仔细的计划,不受支持的方法请求也可能会通过。这就是为什么在405发生时提供明显的错误消息很有用的原因。自定义响应而不是模糊的"方法",以便用户或开发人员了解出了什么问题以及如何纠正响应,例如,通过在响应标头中包含允许方法的列表或在文档中建议正确的方法。

遵循标准

如果您要构建API,坚持休息最佳实践和HTTP标准,使客户更容易知道期望什么。例如,如果您设计了更新资源的终点,请始终使用或始终使用补丁。这种可预测性降低了发送未支撑方法的风险,并帮助外部开发人员正确与您的API互动。

包起来

405方法不允许错误告诉您服务器知道资源的存在,但是它不允许您尝试过的方法。

关键要点: 检查允许标头,查看日志,并确保您的代码和服务器规则匹配您要支持的方法。

撰写者 Hostwinds Team  /  八月 27, 2025