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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:45:40