Symfony6+EasyAdmin4生产环境出现406错误,无法执行增删改操作
问题描述
将项目部署至生产环境后,无法执行创建、编辑和删除操作,操作后会自动跳转至后台仪表盘,浏览器控制台日志显示406 (Not Acceptable)错误。本地开发环境下无此问题,当前使用EasyAdmin 4.4与Symfony 6.0版本,相关DashboardController代码如下:
<?php namespace App\Controller\Admin; use App\Entity\User; use App\Entity\Skills; use App\Entity\Project; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem; use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard; use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator; use EasyCorp\Bundle\EasyAdminBundle\Provider\AdminContextProvider; use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController; class DashboardController extends AbstractDashboardController { private $adminContextProvider; public function __construct(AdminContextProvider $adminContextProvider) { $this->adminContextProvider = $adminContextProvider; } #[Route('/admin', name: 'admin')] public function index(): Response { return $this->render('admin/dashboard.html.twig'); } public function configureDashboard(): Dashboard { return Dashboard::new() ->setTitle('My Project'); } public function configureMenuItems(): iterable { yield MenuItem::linktoRoute('Back to the website', 'fa-solid fa-rotate-left', 'app_home'); yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home'); yield MenuItem::linkToCrud('Profil', 'fas fa-user', User::class); yield MenuItem::linkToCrud('Projects', 'fas fa-list', Project::class); yield MenuItem::linkToCrud('Skills', 'fa-solid fa-gears', Skills::class); } }
可能的原因与解决方案
- 请求头Accept配置异常:生产环境服务器(Nginx/Apache)可能强制修改了请求的
Accept头,导致EasyAdmin的AJAX请求响应格式不被客户端接受。检查服务器配置,确保未篡改请求头;或在EasyAdmin的CRUD配置中明确指定响应格式。 - CSRF令牌验证失败:生产环境下会话Cookie配置(如
cookie_secure)可能与本地不一致,导致CSRF令牌不匹配触发406错误。检查config/packages/framework.yaml中的session配置,确保生产环境下cookie_secure设置符合HTTPS环境要求,同时清除浏览器缓存与服务器缓存。 - 自定义Dashboard路由冲突:当前
DashboardController的index方法返回自定义模板,可能干扰EasyAdmin默认的CRUD路由处理逻辑。尝试替换为默认的Dashboard跳转逻辑:
#[Route('/admin', name: 'admin')] public function index(): Response { $adminUrlGenerator = $this->container->get(AdminUrlGenerator::class); // 跳转到任意一个CRUD页面,示例为User实体 return $this->redirect($adminUrlGenerator->setController(UserCrudController::class)->generateUrl()); }
- 生产环境缓存未更新:Symfony生产环境缓存可能未正确清除,导致路由、配置过时。执行以下命令更新缓存:
php bin/console cache:clear --env=prod php bin/console cache:warmup --env=prod
- CRUD控制器响应格式问题:检查对应实体的CRUD控制器(如
ProjectCrudController),确保未自定义返回格式导致客户端无法接受(例如仅返回JSON但客户端期望HTML)。
内容的提问来源于stack exchange,提问作者Akuseru_w
相关产品推荐
相关产品推荐

