# 游戏发行来源(每游戏独立 origin) # # 部署前替换: # 1) `games.example.com` 为真实发行域,并为 `*.games.example.com` 配置通配 DNS # 与通配 TLS 证书; # 2) `ssl_certificate` / `ssl_certificate_key` 指向该通配证书; # 3) upstream 端口与 api-server 实际监听一致。 # # 设计约定: # - 每个已公开游戏使用自己的子域:`https://.games.example.com/`; # - 该来源只把请求映射到发行网关 # `/api/game-distribution/releases//…`,平台 API、后台、SPA 与上传 # 接口都不在这个来源上暴露; # - 发行来源从不使用 Cookie:带 Cookie 的请求直接 403,转发前也会清空 Cookie; # - `X-Content-Type-Options` / CORP / 无凭据 CORS / HTML CSP / 内容类型白名单由 # api-server 发行网关设置,这里不覆盖,避免两层策略漂移; # - 公开版本切换与下架由后端 `publication_revision` CAS 决定,边缘只做按主机映射。 upstream genarrative_release_api { server 127.0.0.1:8082; keepalive 32; } server { listen 80; server_name ~^(?[a-z0-9_]+)\.games\.example\.com$; location /.well-known/acme-challenge/ { root /var/www/html; } location / { return 301 https://$host$request_uri; } } server { listen 443 ssl http2; server_name ~^(?[a-z0-9_]+)\.games\.example\.com$; ssl_certificate /etc/letsencrypt/live/games.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/games.example.com/privkey.pem; access_log /var/log/nginx/genarrative-release.access.log; error_log /var/log/nginx/genarrative-release.error.log warn; # 发行文件是公开静态资源,从不携带平台 Cookie。带上 Cookie 的请求说明它落在 # 平台会话来源上,直接拒绝,避免发行内容被主站同源脚本读取。 if ($http_cookie) { return 403; } # 子域根路径直接服务该游戏的 index.html,游戏内其余资源按相对路径原样交给 # 发行网关;这样审核通过时填写的 entryUrl 就是 https://.games.example.com/。 location = / { proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Request-Id $request_id; proxy_set_header Cookie ""; proxy_pass http://genarrative_release_api/api/game-distribution/releases/$game_id/index.html; proxy_read_timeout 60s; proxy_send_timeout 60s; } location / { proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Request-Id $request_id; proxy_set_header Cookie ""; proxy_pass http://genarrative_release_api/api/game-distribution/releases/$game_id$request_uri; proxy_read_timeout 60s; proxy_send_timeout 60s; } }