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
相关产品推荐
相关产品推荐

