OCI Distribution Spec实现中如何支持含斜杠的路径变量?
解决OCI Distribution Spec仓库名路径变量匹配问题
你的配置不生效主要有两个核心原因:
- 路径变量正则的多余空格:你写的
{name: .*}里,:和.*之间的空格会被当作正则的一部分,而OCI仓库名不允许包含空格,直接导致匹配失败。 - 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
相关产品推荐
相关产品推荐

