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

Luracast Restler在Nginx+PHP7.1环境下报404错误求助

解决Nginx + PHP7.1环境下Luracast Restler 404错误的方案

我之前在迁移Restler到Nginx环境时也碰到过一模一样的问题——Apache下跑完全正常,换Nginx就直接返回路由阶段失败的404。结合你给出的错误日志(路由阶段失败)和resources.json能正常返回的情况,核心问题基本集中在Nginx的URL重写规则未适配Restler的单入口路由机制,或者PHP请求处理配置有误。下面是一步步的排查和解决方法:

1. 配置Nginx的URL重写规则(最关键)

Restler是单入口应用,所有API请求都需要转发到它的入口文件(通常是index.php),但Nginx不像Apache那样默认支持.htaccess的重写规则,必须手动配置:

修改你的Nginx站点配置文件(比如/etc/nginx/sites-available/api.example.com),添加或调整以下配置:

server {
    listen 80;
    server_name api.example.com;
    # 注意:这里的root要指向Restler的public目录(或你的index.php所在目录)
    root /var/www/api.example.com/public;

    # 处理API路径的重写,确保所有请求都转发到index.php
    location /api {
        # 先尝试访问实际文件/目录,不存在则转发到index.php处理路由
        try_files $uri $uri/ /api/index.php?$query_string;
        # 如果你的index.php在站点根目录,就改成 /index.php?$query_string
    }

    # 确保Nginx能正确解析PHP文件
    location ~ \.php$ {
        # 替换为你的PHP7.1-FPM的连接路径,可能是unix套接字或TCP端口
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        fastcgi_index index.php;
        # 必须正确设置SCRIPT_FILENAME,否则PHP无法找到脚本文件
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

配置完成后,重启Nginx生效:

sudo systemctl restart nginx

2. 验证Restler的BasePath配置

从你的resources.json来看,basePath是https://api.example.com/api,请确保Restler的代码中已正确设置匹配的basePath:

// 你的Restler初始化代码(比如index.php)
$r = new Restler();
$r->setBasePath('/api'); // 必须和Nginx的location路径一致
$r->addAPIClass('YourAPIClass');
$r->handle();

如果Nginx的location是站点根目录(/),那setBasePath也要改成'/',否则路由会不匹配导致404。

3. 检查PHP7.1-FPM的运行状态

确保PHP7.1-FPM服务正常运行,且Nginx的fastcgi_pass指向的路径正确:

  • 查看服务状态:
sudo systemctl status php7.1-fpm
  • 如果服务未运行,启动它:
sudo systemctl start php7.1-fpm
  • 注意:不同系统的PHP-FPM套接字路径可能不同,比如有些是/run/php-fpm/php7.1-fpm.sock,如果是TCP端口的话,格式是127.0.0.1:9001(默认可能是9000,但多版本PHP会改端口)。

4. 排查权限和Nginx错误日志

如果以上配置都没问题,查看Nginx的错误日志(通常在/var/log/nginx/error.log),里面会有更详细的错误信息:

  • 比如是否存在index.php文件权限不足(Nginx/PHP-FPM的用户通常是www-data,需要确保它有读取Restler目录的权限)
  • 或者路径拼写错误(Linux系统路径大小写敏感,注意和Apache环境的差异)

5. 验证Restler路由配置(可选)

因为Apache下能正常运行,这个可能性较低,但可以快速排查:

  • 确认你的API类文件放在了Restler指定的目录(比如api/classes)
  • 检查类和方法上的注解是否正确(比如@url注解的路径是否和请求路径匹配)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:49:16