You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Symfony+Nginx时GET路由/articles返回404问题

问题解决:Symfony路由/articles返回404(Docker+Nginx环境)

问题根源

你的Nginx配置仅对.php后缀的请求做了转发处理,当请求/articles这类无后缀的Symfony路由时,Nginx会直接去/var/www/app/public/目录下查找名为articles的文件/目录,找不到就返回404——这和Symfony单入口应用的路由机制不匹配,Symfony所有路由都需要通过public/index.php来解析。

解决方案:修改Nginx配置

在现有配置中添加一个location块,让Nginx将所有不存在的静态文件/目录的请求转发到index.php,由Symfony处理路由。

修改后的完整Nginx配置如下:

server {

    listen [::]:443 ssl;
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    root /var/www/app/public/;
    index index.php;
    server_name mydomain.com;

    # 新增:处理所有非静态文件的请求,转发到index.php
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        root /var/www/app/public/;
        fastcgi_pass   app:9000;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include   /etc/nginx/fastcgi_params;
    }

}

关键规则说明

  • try_files $uri $uri/ /index.php$is_args$args;:Nginx会先尝试查找请求对应的静态文件($uri),如果找不到就尝试查找目录($uri/),如果都不存在,就把请求转发到index.php,同时保留原始请求的参数($is_args$args),确保Symfony能正确解析路由。

生效步骤

修改配置后,重启你的Nginx容器:

docker restart <你的Nginx容器名>

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:09:22