symfony在docker中报404主因是nginx未正确转发请求至public/index.php或静态资源路径映射错误;需确保location规则、fastcgi_pass指向、script_filename设置、try_files配置、public目录权限、host匹配及缓存清理全部到位。

Symfony 在 Docker 环境中报 404,绝大多数情况不是代码路由写错了,而是请求压根没进 Symfony —— Nginx 没把请求正确转发到 public/index.php,或者静态资源路径映射错位。关键不在 Symfony 配置,而在容器间协作和 Nginx 的底层规则。
确保 Nginx 正确转发 PHP 请求
Nginx 容器不能只靠 root 指向 /var/www/html 就完事。它必须明确将非静态资源请求交给 PHP-FPM 处理,且保留 query string(尤其对 Symfony 的路由匹配至关重要)。
-
location ~ ^/index\.php(/|$):必须存在,且 proxy_pass 要指向 PHP-FPM 容器名+端口(如
fastcgi_pass app:9000),不是 localhost -
fastcgi_param SCRIPT_FILENAME 必须设为
$realpath_root$fastcgi_script_name,否则 Symfony 找不到入口文件 -
try_files $uri /index.php?$query_string 这一行不能少,且必须放在
location /块里,否则子目录或带参数的路由会 404
检查 public 目录挂载与权限
Docker 中 Nginx 默认以 nginx 用户(UID 101)运行,而宿主机代码目录往往属主是当前用户。若未显式授权,Nginx 读不到 public/ 下的 index.php 或 CSS/JS 文件,直接返回 404(不是 403,因为 Nginx 无法 stat 文件就当不存在)。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 启动容器时加
--user www-data或在 Dockerfile 中chown -R 101:101 /var/www - 或用 volume 挂载时加
:z(SELinux)或:Z(强制上下文),如-v $(pwd)/public:/var/www/html:z - 验证方式:
docker exec -it nginx ls -l /var/www/html,确认 index.php 可读
确认域名与 Symfony 的 request host 匹配
Symfony 路由默认不校验 host,但若你用了 host 条件(如 host: "admin.example.com"),而 Nginx 的 server_name 或 Host 请求头不一致,就会跳过该路由,最终 fallback 到未定义路由 → 404。
- 检查
nginx.conf中server_name是否与实际访问域名一致(开发可用server_name _;兜底) - 在控制器中临时加
dd($request->getHost()),看 Symfony 收到的 host 是什么 - 若用反向代理(如 Traefik),需配置
trusted_hosts并设置X-Forwarded-Host头
排除缓存与 autoloader 干扰
开发环境下 APP_ENV=dev 仍可能因缓存残留导致路由“消失”:比如改了 routes.yaml 但没清缓存,或 composer autoload 没更新,导致控制器类根本加载失败 —— 此时 Symfony 根本不会进入路由匹配流程,直接抛出 404。
- 进入 app 容器执行:
php bin/console cache:clear --env=dev - 检查
var/cache/dev/srcApp_KernelDevDebugContainer.php是否包含你新增的路由定义 - 运行
composer dump-autoload确保新控制器类被识别










