You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OCI Distribution Spec实现中如何支持含斜杠的路径变量?

解决OCI Distribution Spec仓库名路径变量匹配问题

你的配置不生效主要有两个核心原因:

  1. 路径变量正则的多余空格:你写的{name: .*}里,:和.*之间的空格会被当作正则的一部分,而OCI仓库名不允许包含空格,直接导致匹配失败。
  2. JAX-RS默认匹配逻辑限制:即使去掉空格,部分JAX-RS实现(如RESTEasy)默认会限制路径变量不包含/,或者匹配逻辑提前终止,无法完整捕获多级路径的仓库名。

针对这些问题,给出两种解决方式:

方式一:使用OCI规范的严格正则(推荐)

直接将OCI定义的仓库名正则集成到@Path注解中,注意在Java字符串中转义正则里的特殊字符(比如\.要写成\\.):

@Path("/v2/{name: [a-z0-9]+((\\.|_|__|-+)[a-z0-9]+)*(\\/[a-z0-9]+((\\.|_|__|-+)[a-z0-9]+)*)*}/blobs")

这个正则严格遵循OCI规范:

  • 仅允许小写字母、数字开头
  • 支持.、_、__、连续-作为分隔符
  • 完美匹配多级路径(如bitnami/nginx、a/b/c/d/e)

方式二:调整JAX-RS框架配置(宽松模式)

如果只是临时测试,不想用复杂正则,可通过框架配置允许路径变量包含/:

针对Jersey(JAX-RS参考实现)

开启允许路径变量包含斜杠的配置:

import org.glassfish.jersey.server.ServerProperties;
import org.glassfish.jersey.server.ResourceConfig;

public class OciDistributionConfig extends ResourceConfig {
    public OciDistributionConfig() {
        property(ServerProperties.ALLOW_ESCAPED_SLASHES, true);
        register(BlobResource.class); // 注册你的资源类
    }
}

同时修正@Path的正则(去掉空格):

@Path("/v2/{name:.*}/blobs")

针对RESTEasy

RESTEasy默认支持路径变量包含/,只需修正@Path为:

@Path("/v2/{name:.+}/blobs")

(.+会贪婪匹配到/blobs之前的所有内容,包括多级路径的/)

注意:宽松模式会匹配不符合OCI规范的仓库名,生产环境务必使用方式一的严格正则。


内容的提问来源于stack exchange,提问作者XenoAmess

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:13:23