两个Docker化API Platform应用本地通信的HTTPS问题求助
问题1:解决容器间HTTPS请求报错
这个报错是因为API Platform本地环境使用自签名SSL证书,App1的PHP容器默认不认可该证书,导致SSL握手失败。以下是两种适合本地开发的解决办法:
方法1:让App1信任App2的自签名证书
- 定位App2容器内的自签名证书路径:API Platform默认通过Caddy生成证书,路径一般为
/data/caddy/certificates/local/<domain>/<domain>.crt(可根据实际Caddy配置目录调整)。 - 在App1的
compose.yaml中,将App2的证书目录挂载到PHP容器的系统信任证书目录,并添加证书更新命令:
(若两个容器在同一网桥,也可通过共享卷方式挂载证书)services: php: [...] volumes: - /path/to/app2/caddy/certificates:/usr/local/share/ca-certificates/app2-cert command: sh -c "update-ca-certificates && php-fpm" - 重启App1的PHP容器,证书会被加入信任列表,后续请求即可正常完成SSL握手。
方法2:临时禁用SSL验证(仅本地开发使用,生产环境绝对禁止)
如果用Guzzle发起请求,在客户端配置中关闭SSL验证:
$client = new \GuzzleHttp\Client([ 'verify' => false, ]);
如果用curl命令,添加-k参数跳过证书校验:
curl -k https://<app2-container-name>/api/v1/<some-endpoint>
问题2:本地禁用API Platform的HTTPS,阻止HTTP重定向
API Platform默认通过Caddy反向代理+Symfony配置强制HTTPS,要完全禁用需修改两处核心配置:
1. 修改Caddy配置(关键步骤)
找到项目根目录的Caddyfile,将HTTPS相关配置替换为HTTP:
原配置示例:
{$SERVER_NAME} tls internal reverse_proxy php:9000
修改后:
http://{$SERVER_NAME} reverse_proxy php:9000
(删除tls internal行,给域名前缀添加http://)
2. 调整Symfony框架配置
- 在项目根目录的
.env文件中,将APP_URL改为HTTP地址:APP_URL=http://localhost:80 - 打开
config/packages/framework.yaml,删除或注释强制HTTPS的相关配置:# framework: # session: # cookie_secure: true # http_client: # default_options: # verify_peer: true - 若使用Security组件,打开
config/packages/security.yaml,将require_channel: https改为http或直接删除:# security: # firewalls: # main: # require_channel: http
3. 更新Docker端口映射
在compose.yaml中,将Caddy服务的端口从443改为80:
services: caddy: [...] ports: - "80:80" # 删除原443端口映射
重启所有容器后,HTTP请求将不再被重定向到HTTPS。
内容的提问来源于stack exchange,提问作者Red Alpaca
相关产品推荐
相关产品推荐

