Drupal 9提交POST请求到/user/login时出现404错误
问题排查与解决方案
核心症状
/user/login页面加载正常,填写表单提交后,Nginx日志显示POST请求返回404- 提交后页面重定向回登录页,无任何错误提示,无法正常登录
- 使用
drush uli <username>生成的一次性链接可正常登录 - 站点是生产环境的局域网副本,已完成本地配置调整,
core/modules/user/user.routing.yaml中POST路由配置正常
排查步骤与解决方法
1. 检查Nginx的Drupal路由重写配置
Nginx未正确处理Drupal的干净URL重写是这类问题的常见诱因,尤其是POST请求。确保你的Nginx配置文件包含以下重写规则:
location / { try_files $uri $uri/ /index.php?$query_string; }
如果是子目录部署的站点,需调整重写路径,示例:
location /your-subdir/ { try_files $uri $uri/ /your-subdir/index.php?$query_string; }
修改后重启Nginx:sudo systemctl restart nginx
2. 验证CSRF令牌有效性
Drupal表单依赖CSRF令牌防止跨站请求伪造,令牌生成或验证失败会导致POST请求被拦截(表现为404或无提示重定向):
- 打开浏览器开发者工具(F12)切换到网络标签,重新提交登录表单,查看POST请求的表单数据中是否包含
form_token字段 - 若没有该字段,清除浏览器缓存和Cookie后重试;若存在,检查
sites/default/settings.php中的$settings['trusted_host_patterns']是否匹配本地域名,示例配置:$settings['trusted_host_patterns'] = [ '^your-local-domain\.com$', '^localhost$', ];
3. 检查表单提交的目标路径
通过浏览器开发者工具的元素标签查看登录表单的action属性,确认是否指向正确的/user/login路径:
<form class="user-login-form" action="/user/login" method="post">
若action路径错误,检查sites/default/settings.php中的$base_url是否正确设置为本地站点的完整URL。
4. 清除Drupal路由缓存
即便路由配置正常,缓存可能导致旧配置生效,执行命令清除缓存:
drush cr
若未安装drush,可通过已登录账号访问/admin/config/development/performance页面手动清除缓存。
5. 检查Nginx请求大小限制(可选)
若表单数据过大,Nginx的client_max_body_size配置可能拦截请求,表现为404或无响应。在Nginx配置中添加或调整:
client_max_body_size 10M;
重启Nginx后重试。
内容的提问来源于stack exchange,提问作者Sp4cecat
相关产品推荐
相关产品推荐

