Docker中Nginx部署Laravel仅显示首页,其他路由404问题
问题:Laravel自定义路由/wel返回404,根路由正常
通过Docker Compose部署Nginx与Laravel(PHP 8-FPM)服务,已配置目录挂载、端口映射及Nginx SSL站点规则。访问根路由/可正常显示Laravel欢迎页,但访问自定义路由/wel时出现404 Not Found错误,排查后怀疑Nginx的default.conf配置存在问题。
相关配置
Docker Compose配置
nginx: image: nginx volumes: - ./app:/var/www/html:delegated - ./config/nginx/default.conf:/etc/nginx/conf.d/default.conf ports: - "444:444" depends_on: - laravel laravel: image: php:8-fpm volumes: - ./app:/var/www/html:delegated ports: - "4444:4444"
Nginx配置文件default.conf
server { index index.php; listen 444 ssl; server_name local.myapp; root /var/www/html/public; ssl_certificate /root/ssl/certificate.pem; ssl_certificate_key /root/ssl/key.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; location ~ [^/]\.php(/|$) { try_files $uri =404; fastcgi_split_path_info ^(.+?\.php)(/.*)$; root /var/www/html/public; fastcgi_pass laravel:4444; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_read_timeout 900s; include fastcgi_params; } }
Laravel路由配置
Route::get('/', function () { return view('welcome'); }); Route::get('/wel', function () { return view('welcome'); });
解决方案
修改Nginx的default.conf,添加处理非静态文件路由的location /块,将所有非静态文件请求转发到Laravel入口文件index.php:
server { index index.php; listen 444 ssl; server_name local.myapp; root /var/www/html/public; ssl_certificate /root/ssl/certificate.pem; ssl_certificate_key /root/ssl/key.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; # 优先处理静态文件,不存在则转发到Laravel入口 location / { try_files $uri $uri/ /index.php?$query_string; } location ~ [^/]\.php(/|$) { try_files $uri =404; fastcgi_split_path_info ^(.+?\.php)(/.*)$; root /var/www/html/public; fastcgi_pass laravel:4444; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_read_timeout 900s; include fastcgi_params; } }
原因分析
- 根路由
/能正常访问,是因为Nginx的index index.php配置自动将根路径指向index.php,触发了PHP处理规则。 - 自定义路由
/wel不属于PHP文件请求,原有配置中无对应处理逻辑,Nginx会尝试查找/var/www/html/public/wel文件或目录,找不到则返回404。 - 添加
location /块后,Nginx先尝试访问静态文件,若不存在则将请求转发到index.php,由Laravel路由系统解析自定义路由,从而解决404问题。
内容的提问来源于stack exchange,提问作者oderfla
相关产品推荐
相关产品推荐

