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

Docker本地同容器两PHP站点无法跨站本地请求问题排查

问题根因
  • 浏览器能正常访问两个本地测试域名,是因为宿主机hosts文件配置了website-A-local、website-B-local到127.0.0.1的映射,请求通过宿主机80端口转发到Apache容器。但PHP代码运行在独立的php容器内部,容器默认DNS解析中没有这两个域名的记录,请求无法路由到目标服务,PHP未开启错误提示时就会表现为静默失败。
  • 现有links配置仅为php容器添加了apache、epicor-web-local两个主机别名,和代码中使用的本地域名不匹配,无法完成解析。
  • 替换为生产环境地址能正常加载,是因为公网DNS可正常解析生产域名,请求链路通畅,也反向证明PHP的远程文件加载相关配置处于开启状态。
  • 单Apache实例配置多虚拟主机托管两个站点的场景下,即使解析通了,如果Apache虚拟主机规则中没有配置对应域名的ServerName,请求会默认落到第一个虚拟主机上,同样会找不到目标文件。
配置步骤

1. 配置容器内DNS解析

直接修改docker-compose.yml,为Apache服务添加网络别名,Docker内置DNS会自动将别名解析到Apache容器的内部IP,同网络下所有容器都可以直接通过这些别名访问Apache服务,无需手动维护IP映射:

services :
  # Apache
  apache :
    build : '.\docker\apache\'
    ports :
      - 80:80
    volumes :
      - ./:/var/www/html/
    # 新增以下网络别名配置
    networks:
      default:
        aliases:
          - website-A-local
          - website-B-local

  # PHP 其余配置保持不变即可
  php :
    build : '.\docker\php\'
    environment:
      XDEBUG_CONFIG: remote_host=host.docker.internal remote_port=9003 remote_enable=1
    volumes :
      - ./:/var/www/html/
    links:
      - apache:epicor-web-local
    expose:
      - 9003

如果后续新增测试域名,直接在aliases列表下追加即可,重启容器就会生效。

2. 校验Apache虚拟主机配置

确保Apache中两个站点的虚拟主机规则匹配对应域名:

  • 托管website-A的VirtualHost块中,ServerName配置为website-A-local,站点根目录指向A站代码路径
  • 托管website-B的VirtualHost块中,ServerName配置为website-B-local,站点根目录指向B站代码路径
    配置完成后重载Apache服务,保证容器内发起带对应Host头的请求时,Apache能正确路由到目标站点,不会返回默认站点的404响应。

3. 校验PHP配置(可选,生产地址可访问时可跳过)

进入php容器检查php.ini配置,确保两个核心开关处于开启状态:

  • allow_url_fopen = On:保证file_get_contents等函数可以发起远程HTTP请求
  • allow_url_include = On:保证include/require可以加载远程HTTP/HTTPS资源
    修改配置后重启php容器生效。开发环境建议同时开启display_errors = On、设置error_reporting = E_ALL,遇到问题不会静默失败,可直接看到错误原因减少排查成本。

4. 重启服务验证

执行命令重启所有容器让配置生效:

docker-compose down && docker-compose up -d

验证链路:进入php容器内部,先测试域名解析是否正常,再测试HTTP请求是否能拿到目标文件内容

# 进入php容器命令行
docker-compose exec php bash
# 测试解析,能返回Apache容器IP即为正常
ping website-A-local -c 3
# 测试HTTP请求,能正常返回some-file.php的内容即为链路通畅
curl http://website-A-local/api/some-file.php

验证通过后,PHP代码中的include、file_get_contents等函数就可以正常通过本地域名调用同环境下的跨站资源了。

优化建议

你当前的配置中,Apache和php容器都把本地代码目录挂载到了/var/www/html/,意味着两个站点的代码在php容器内可以直接通过文件系统访问,不需要走HTTP请求加载:

// 直接通过本地文件路径加载,性能远高于HTTP请求,无网络波动、服务重启导致的加载失败问题
include('/var/www/html/path-to-website-A/api/some-file.php');

非必要不推荐用HTTP方式include同环境下的PHP文件,这类请求会走完完整的Web服务处理流程,性能差且稳定性低。

内容的提问来源于stack exchange,提问作者S.Mason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 01:01:00