Symfony升级后404主因是路由匹配逻辑变严格,需显式声明defaults(如'_locale' => 'en')和requirements(如'lang' => '[a-z]{2}'),并确保子域名路由添加host约束、服务器配置同步、缓存清理及security host策略一致。

Symfony2升级后出现404,多数不是路由没写,而是规则匹配逻辑变了——路径解析、默认值、主机约束这些细节在新版本里不再“宽容”,必须显式声明。
PHP路由必须补全defaults和requirements
Symfony2用YAML写路由时,{lang}这种占位符会自动继承隐式默认值(比如_locale: en),但升级到Symfony4+后,PHP路由定义(config/routes.php)不再自动填充。漏掉->defaults()或->requirements(),就会导致参数不匹配、路由跳过、最终404。
- 显式设默认语言:
->defaults(['_locale' => 'en']) - 加正则限制防止误匹配:
->requirements(['lang' => '[a-z]{2}']),否则{lang}可能匹配到admin这类字符串,破坏优先级 - 子域名路由必须加
->host('{domain}.example.com')并确保domain有->requirements(['domain' => 'app|api|admin'])
服务器配置要同步支持子域名转发
本地symfony server:start能跑通,上线就404?大概率是Nginx/Apache没把子域名请求正确打到public/index.php。
- Nginx需确认
server_name包含完整子域名,且root指向public/目录 - Apache要启用
AllowOverride All,确保.htaccess重写生效;若禁用.htaccess,需把重写规则挪进VirtualHost配置 - 检查
fastcgi_pass或proxy_pass是否指向正确的PHP-FPM socket或端口
缓存和路由编译别跳过验证步骤
升级后第一次访问404,常因缓存残留旧路由或未重新生成路由映射。
- 删干净缓存:
rm -rf var/cache/*,再跑php bin/console cache:clear --env=prod - 验证路由是否加载:
php bin/console debug:router,确认你的路由名和路径出现在列表里 - 如果用了EasyAdmin,检查其
dashboard或crud路由是否被security.yaml中的access_control规则意外拦截
认证与Host匹配冲突也要排查
有些项目在security.yaml里写了host: admin.example.com,但路由本身没设host约束,结果请求被安全层拒绝,返回404而非登录页。
- 统一Host策略:路由定义、security access_control、vhost配置三者
server_name/host字段要一致 - 临时加日志:在
Kernel::handle()入口或RouterListener里dump$request->getHost()和$request->getBaseUrl(),确认实际收到的Host头没被反向代理篡改 - 若用Cloudflare等CDN,检查是否开启“强制HTTPS”或“缓存HTML”,可能把未登录跳转当成静态页缓存了



















