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

Docker化环境Nginx配置问题:Laravel路径指向异常

解决Docker环境下Nginx代理Laravel的404问题

问题核心

访问http://localhost:8000/laravel返回404,Nginx日志显示尝试读取/etc/nginx/html/index.php,而非预期的/usr/src/app路径,原因是Nginx配置的路径解析逻辑错误,未正确关联Laravel容器的文件路径。

排查出的问题点

  1. 全局根目录未配置:Nginx server块未设置全局root,导致try_files中的/index.php默认指向Nginx内置的根目录/etc/nginx/html。
  2. 路径前缀未处理:访问/laravel路径时,Nginx未去掉前缀直接查找文件,导致尝试读取/usr/src/app/laravel/index.php(实际Laravel的index.php在/usr/src/app/),且兜底的/index.php因无全局root而走默认路径。
  3. 环境变量替换遗漏:entrypoint.sh未包含NGINX_ROOT变量,导致模板中的${NGINX_ROOT}无法被正确替换。

修复步骤

1. 修改Nginx配置模板(fpm-template.conf)

更新server块和/laravel location的逻辑,确保路径解析正确:

server {
    listen 80;

    # 设置全局根目录,与Laravel容器内的路径一致
    root ${NGINX_ROOT};
    index index.php;

    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/x-javascript text/xml 
application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;

    location /react {
        proxy_pass http://${NGINX_NODE_HOST}:${NGINX_NODE_PORT};
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    location /laravel {
        # 重写URI,去掉/laravel前缀,让Laravel处理正确的路径
        rewrite ^/laravel/(.*)$ /$1 break;
        try_files $uri $uri/ /index.php?$query_string;

        location ~ \.php$ {
            include fastcgi_params;
            fastcgi_pass ${NGINX_FPM_HOST}:${NGINX_FPM_PORT};
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            # 传递前缀信息,确保Laravel生成正确的URL
            fastcgi_param HTTP_X_FORWARDED_PREFIX /laravel;
        }
    }

    client_max_body_size 2m;
}

2. 更新entrypoint.sh,补全环境变量替换

添加$NGINX_ROOT到envsubst的变量列表,确保模板中的${NGINX_ROOT}能被正确替换:

#!/bin/bash

envsubst '$NGINX_REACT_ROOT $NGINX_LARAVEL_ROOT $NGINX_FPM_HOST $NGINX_FPM_PORT $NGINX_NODE_HOST $NGINX_NODE_PORT $NGINX_ROOT' < /etc/nginx/fpm.tmpl > /etc/nginx/conf.d/default.conf
exec nginx -g "daemon off;"

3. 调整docker-compose.yaml中的Nginx挂载(可选但建议)

确保Nginx容器能访问Laravel的静态资源,若需要更完整的路径匹配,可添加全目录挂载:

dev_nginx:
    # ...其他配置不变
    volumes:
      - .:/usr/src/app  # 添加此行,确保Nginx能解析文件路径(可选)
      - ./public:/usr/src/app/public

验证方法

  1. 重启所有容器:docker-compose down && docker-compose up --build
  2. 访问http://localhost:8000/laravel,确认返回Laravel页面而非404
  3. 查看Nginx日志:docker logs dev_nginx,确认不再出现/etc/nginx/html/index.php的错误路径

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:49:57