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

AWS CloudFront反向代理KeyCloak路径配置问题求助

KeyCloak反向代理(CloudFront)下资源路径配置问题

现状

ECS上容器运行正常,但访问https://<url>.de/auth/admin/master/console/时返回403错误,核心原因是资源请求路径异常:

GET https://url.de/resources/ly799/admin/keycloak.v2/assets/main-CvkXqs02.css net::ERR_ABORTED 403 (Forbidden)

当前CloudFront仅配置了/auth/**的行为,直接请求/resources/**会触发403;添加/resources/**行为后又返回404,说明KeyCloak未将资源路径映射到/auth/resources前缀下。

核心需求

  • 用户通过<url>/auth/**访问KeyCloak全部功能
  • KeyCloak运行在/auth/前缀路径下
  • 仅允许CloudFront的HTTPS访问,直接HTTP访问EC2 IP报错(已实现)

已配置内容

1. CloudFront

  • 源指向EC2实例的8081端口
  • 行为auth/**:HTTP重定向到HTTPS,允许所有HTTP方法,缓存策略为CachingOptimized,源请求策略为AllViewerExceptHostHeader

2. 初始KeyCloak Docker配置

FROM quay.io/keycloak/keycloak:26.0.0 AS builder

RUN /opt/keycloak/bin/kc.sh build \
    --features=admin,preview,hostname:v2 \
    --spi-hostname-default-hostname=https://<url>.de \
    --spi-hostname-default-admin=https://<url>.de/auth \
    --spi-hostname-default-path=/auth \
    --spi-hostname-default-strict=true \
    --spi-hostname-default-strict-https=false \
    --spi-hostname-default-forwarded=true \
    --http-relative-path=/auth \
    --db=postgres

FROM quay.io/keycloak/keycloak:26.0.0

COPY --from=builder /opt/keycloak/ /opt/keycloak/

EXPOSE 8081

# Runtime
ENV KC_DB_URL=jdbc:postgresql://localhost:5432/keycloak_db
ENV KC_BOOTSTRAP_ADMIN_USERNAME=admin
ENV KC_BOOTSTRAP_ADMIN_PASSWORD=test
ENV KC_PROXY_HEADERS=xforwarded
ENV KC_HTTP_RELATIVE_PATH=/auth

ENV KC_HOSTNAME=https://<url>.de
ENV KC_HTTP_ENABLED=true
ENV KC_HTTP_PORT=8081

ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]
CMD ["start", "--optimized", "--proxy-headers=xforwarded", "--hostname-debug=true"]

本地测试(去掉KC_PROXY_HEADERS,KC_HOSTNAME设为localhost)时,KeyCloak能正确处理/auth/和/auth/resources路径请求。

3. 更新后的配置

调整Dockerfile并在CloudFront添加/resources/**、/admin/**行为后:

FROM quay.io/keycloak/keycloak:26.0.0

RUN /opt/keycloak/bin/kc.sh build --db=postgres --features=hostname:v2 --http-relative-path=/auth

ENV KC_DB_URL=jdbc:postgresql://localhost:5432/keycloak_db
ENV KC_BOOTSTRAP_ADMIN_USERNAME=admin
ENV KC_BOOTSTRAP_ADMIN_PASSWORD=123
ENV KC_HOSTNAME=https://xxx.xxx.net
ENV KC_HOSTNAME_ADMIN=https://xxx.xxx.net
ENV KC_HOSTNAME_BACKCHANNEL_DYNAMIC=true
ENV KC_HTTP_ENABLED=true
ENV KC_HTTP_PORT=8081
ENV KC_PROXY_HEADERS=xforwarded
ENV KC_HOSTNAME_STRICT=true

EXPOSE 8081

ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]
CMD ["start", "--optimized", "--hostname-debug=true"]

主控制台和/auth/**下的领域可正常访问,但资源请求仍失败,问题集中在KeyCloak路径配置。

解决方案

1. 修正KeyCloak核心配置

问题根源是KeyCloak生成的资源URL未携带/auth前缀,结合CloudFront代理场景,调整环境变量:

# 管理控制台完整路径需包含/auth前缀
ENV KC_HOSTNAME_ADMIN=https://xxx.xxx.net/auth
# 强制所有资源路径带上/auth前缀
ENV KC_HTTP_RELATIVE_PATH=/auth
# 使用edge代理模式,适配CloudFront这类反向代理场景
ENV KC_PROXY=edge

KC_PROXY=edge会让KeyCloak完全依赖代理传递的头部生成正确URL,比xforwarded更适配CloudFront。

2. 简化CloudFront行为

无需额外配置/resources/**或/admin/**,仅保留/auth/**行为即可——所有资源请求会被KeyCloak映射到/auth/resources路径下,CloudFront只需将/auth/**请求转发到EC2 8081端口。同时确保源请求策略保留X-Forwarded-Path等头部,让KeyCloak识别完整请求路径。

3. 统一构建与运行配置

构建时同步指定代理模式,避免配置冲突:

RUN /opt/keycloak/bin/kc.sh build \
    --db=postgres \
    --features=hostname:v2 \
    --http-relative-path=/auth \
    --proxy=edge

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:22:10