HTTPQUERY
English

423 Locked

用法

423 Locked 错误是 WebDAV 的一部分,WebDAV 被用作基于 HTTP 的文件系统。客户端可以选择对文件执行 LOCK 或 UNLOCK 操作,如果客户端试图修改一个已锁定的资源,服务器就会返回此错误。

当服务器首次授予锁时,会向客户端发送 Lock-Token 响应头,之后可用它来解锁资源或刷新锁。

作为响应的一部分,服务器会包含相应的前置条件或后置条件码以帮助引导客户端,例如 lock-token-submitted 或 no-conflicting-lock。

在 WebDAV 之外,一些平台复用 423 来表示账户级别的锁定。当店铺因反复违反 API 速率限制或存在未结清的账户余额而被锁定时,Shopify API 会返回 423 Locked。店主必须先通过 Shopify 合作伙伴面板解决问题,API 访问才会恢复。这种用法与文件锁定无关。

SEO 影响

像 Google 这样的搜索引擎不会索引返回 423 Locked 状态的 URL。过去已被索引但返回此状态码的 URL 会从搜索结果中移除。

示例

客户端尝试将文件上传到目标文件夹。该文件夹已被锁定,因此操作不被允许,返回 423 Locked 错误。在后续请求中,客户端通过在 If 请求头中包含 Lock-Token 来请求解锁该资源。

请求成功,因为当时该文件夹上只有一个锁。UNLOCK 成功仅意味着由指定 Lock-Token 所指向的那个锁被移除。其他锁仍然生效,会再次返回 423 Locked。

初始请求

PUT /documents/ HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000

<PDF file transferred>

初始响应

HTTP/1.1 423 Locked
Content-Type: application/xml
Content-Length: 163

<?xml version="1.0" encoding="utf-8" ?>
<d:error xmlns:d="DAV:">
  <d:lock-token-submitted>
    <d:href>/documents/</d:href>
  </d:lock-token-submitted>
</d:error>

第二次请求,包含解锁请求

PUT /documents/ HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000
If: (<urn:uuid:123…789>)

<PDF file transferred>

最终响应

HTTP/1.1 204 No Content

如何修复

检查响应体中的前置条件码。lock-token-submitted 错误表示请求缺少所需的锁令牌。no-conflicting-lock 错误表示另一个锁阻止了访问。

如果该锁属于同一客户端会话,在 If 请求头中包含 Lock-Token 值并重新发送请求。服务器会校验令牌并允许修改。

如果锁由其他用户或进程持有,请等待锁过期或联系锁的持有者。锁的超时时间在 WebDAV 服务器上可配置。查看最初授予锁时返回的 Timeout 头值,以确定锁会持续多久。

对于 SharePoint 和 Office Online 环境,被桌面应用锁定的文件会一直保持锁定,直到应用关闭或可配置的超时时间到期。管理员可以通过 SharePoint 管理界面释放过时的锁。

发送带有匹配 Lock-Token 的 UNLOCK 请求以显式释放某个锁。成功解锁只会移除指定的锁。同一资源上的其他锁仍处于活动状态,会继续触发此错误。

在服务器端,设置合理的锁超时时间,以防止被遗弃的锁无限期地阻塞其他客户端。WebDAV 规范建议服务器强制执行超时限制,而不是授予无限期的锁。

对于 Shopify API 使用者,423 意味着店铺本身被锁定。通过合作伙伴面板结清任何未结余额,或联系 Shopify 支持以恢复 API 访问。

代码参考

.NET

HttpStatusCode.Locked

Rust

http::StatusCode::LOCKED

Rails

:locked

Go

http.StatusLocked

Symfony

Response::HTTP_LOCKED

Python3.5+

http.HTTPStatus.LOCKED

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_LOCKED

Angular

@angular/common/http/HttpStatusCode.Locked