symfony部署后404说明请求未进内核,需先确认public/index.php是否可达、重写规则是否生效(apache启mod_rewrite并allowoverride all,nginx配try_files $uri $uri/ /index.php?$query_string),再通过curl响应头或日志验证是否抵达内核,最后检查prod环境路由注册与host绑定。

当你在本地运行 Symfony 7.1 应用时路由能正常访问,但部署后通过域名或子域名打开却直接返回 404 页面,说明请求根本没进 Symfony 内核——连路由匹配环节都没触发,必须从 Web 服务器入口开始逐层排查。
确认请求是否抵达 Symfony 入口文件
第一步:访问 public/index.php 的绝对路径(例如 https://example.com/public/index.php),如果页面能正常加载 Symfony 欢迎页或跳转到首页,说明 PHP 和 Symfony 运行环境基本就绪;如果报错或空白,问题出在 PHP 配置、权限或文件缺失。
第二步:检查 public/ 目录下是否存在 index.php 文件,且其内容以 <?php 开头,末尾有 require __DIR__.'/../vendor/autoload.php'; 和 $kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); 等关键行。缺少 autoload.php 或 Kernel 实例化失败会导致 404 或白屏。
第三步:临时将 public/index.php 第一行改为 <?php die('index.php reached');,再刷新原域名首页。若看到该文字,证明 Web 服务器已将请求正确转发到 index.php;若仍 404,说明重写规则未生效或虚拟主机未指向 public 目录。
验证服务器重写规则是否生效
Apache 用户请确认:
① mod_rewrite 已启用(a2enmod rewrite);
② virtual host 中 AllowOverride All 已设置;
③ public/.htaccess 文件存在且内容包含标准 Symfony 重写规则(含 RewriteCond %{REQUEST_FILENAME} !-f 和 RewriteRule ^(.*)$ index.php [QSA,L])。
Nginx 用户必须显式配置重写,不能依赖 .htaccess。检查 server 块中是否有如下关键段:
location / {<br> try_files $uri $uri/ /index.php?$query_string;<br>}
【注意】Nginx 的 try_files 必须包含 /index.php?$query_string,漏掉 $query_string 会导致 GET 参数丢失,部分路由因参数不匹配而 404。
验证方式:在 public/ 下新建 test.txt,访问 https://example.com/test.txt 应返回文件内容;再访问 https://example.com/nonexistent,若返回 Nginx 默认 404 页面而非 Symfony 的 404,则重写未生效。
区分“服务器级 404”和“Symfony 路由级 404”
方法一:用 curl 查看响应头:curl -I https://example.com/some-route
若返回 HTTP/2 404 且 Server 字段是 nginx 或 Apache,说明是 Web 服务器返回的 404——请求未到达 Symfony;
若返回 HTTP/2 404 且 X-Debug-Token 或 X-Powered-By: Symfony 存在,说明 Symfony 已接管请求但找不到路由。
方法二:临时修改 public/index.php,在 $kernel->handle($request) 前加一行:file_put_contents('/tmp/symfony_hit.log', date('c')."\n", FILE_APPEND);。访问任意路径后检查 /tmp/symfony_hit.log 是否有新增时间戳。有则进内核,无则卡在 Web 服务器层。
方法三:清空缓存并强制重新生成路由映射:php bin/console cache:clear --env=prodphp bin/console debug:router --env=prod
输出应列出所有已注册路由。若命令报错或列表为空,说明路由文件未加载或语法错误(如 YAML 缩进错、PHP 语法错误)。
检查路由定义与环境匹配
第一步:确认当前环境变量 APP_ENV=prod(生产环境)且 APP_DEBUG=false。若误设为 dev,某些路由可能因环境条件被跳过。
第二步:检查 config/routes.yaml 或注解路由是否被正确加载。运行:php bin/console debug:router --env=prod | grep your_route_name
若无输出,说明该路由未注册。常见原因:
• routes.yaml 中用了 controllers: 但未启用 framework.controller_loader;
• 注解路由未在 config/packages/framework.yaml 中启用:annotations: true;
• 路由文件位于 config/routes/prod/ 下但未被 import。
第三步:子域名路由需显式绑定 host。例如:homepage:<br> path: /<br> controller: App\Controller\DefaultController::index<br> host: 'admin.example.com'
若 host 不匹配,即使路径正确也返回 404。










