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

Nginx try_files指令回退URI配置错误导致Laravel服务404 Not Found求助

Nginx try_files指令回退URI配置错误导致Laravel服务404 Not Found求助

我仔细看了你的问题描述、Nginx配置、Docker相关文件,还有错误日志,发现问题出在Nginx的location /subscription块里的try_files回退路径配置,以及FastCGI脚本文件名的参数设置上,导致Nginx无法正确定位到Laravel的入口文件public/index.php。

错误原因分析

从你的Nginx错误日志能明确看到问题点:

2025/06/08 09:24:32 [error] 22#22: *2 open() "/etc/nginx/html/index.php" failed (2: No such file or directory), client: 172.18.0.1, server: localhost, request: "POST /subscription/subscriptions/ HTTP/1.1"

这说明Nginx在尝试回退到入口文件时,错误地去默认根目录/etc/nginx/html找index.php,而不是你映射的Laravel项目/var/www/html/public目录。根源有两个:

  • 你用alias指令把/subscription映射到/var/www/html/public,但try_files的最后一个回退URI写了/subscription/index.php?$query_string,这个路径结合alias会导致Nginx解析路径出错;
  • FastCGI的SCRIPT_FILENAME参数用了$request_filename,在alias场景下这个变量会生成错误的文件路径。

修正后的Nginx配置

把你的Nginx server块里的location /subscription部分改成下面这样:

server {
    listen 80;
    server_name localhost;

    location /subscription {
        alias /var/www/html/public;
        index index.php index.html index.htm;
        # 关键修正:回退URI改为/index.php,去掉前面的/subscription前缀
        try_files $uri $uri/ /index.php?$query_string;

        location ~ \.php$ {
            include fastcgi_params;
            fastcgi_pass subscription_service:9000;
            fastcgi_index index.php;
            # 关键修正:用$document_root$fastcgi_script_name代替$request_filename
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
            expires max;
            log_not_found off;
        }
    }
}

为什么这样改?

  • 当使用alias时,try_files的回退URI不需要带/subscription前缀,因为alias已经把/subscription路径映射到了/var/www/html/public,直接写/index.php就会指向/var/www/html/public/index.php;
  • $document_root在alias场景下会被自动设置为/var/www/html/public,$fastcgi_script_name是当前请求的PHP脚本路径(比如/index.php),两者拼接后就是正确的脚本文件路径,完美避免了$request_filename在alias下的路径解析错误。

额外检查点

  • 确认本地./backend/subscription_service/public目录存在且包含index.php:从你的docker-compose.yaml配置看,Nginx容器已经映射了这个目录,只要本地文件没问题就OK;
  • 重启容器让新配置生效:
    docker-compose down && docker-compose up -d --build
    

这样调整后,POST请求/subscription/subscriptions/应该就能正确转发到Laravel的入口文件处理,不会再返回404了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 07:47:58