当前位置: 首页 > news >正文

nginx File not found 错误

使用php-fpm解析PHP,"No input file specified","File not found"是令nginx新手头疼的常见错误,原因是php-fpm进程找不到SCRIPT_FILENAME配置的要执行的.php文件,php-fpm返回给nginx的默认404错误提示。

比如我的网站doucument_root下没有test.php,访问这个文件时通过抓包可以看到返回的内容。

HTTP/1.1 404 Not Found
Date: Fri, 21 Dec 2012 08:15:28 GMT
Content-Type: text/html
Proxy-Connection: close
Server: nginx/1.2.5
X-Powered-By: PHP/5.4.7
Via: 1.1 c3300 (NetCache NetApp/6.0.7)
Content-Length: 16

File not found.

 

很多人不想用户直接看到这个默认的404错误信息,想自定义404错误.

 

给出解决办法前我们来先分析下如何避免出现这类404错误,然后再说真的遇到这种情况(比如用户输入一个错误不存在的路径)时该怎么办,才能显示自定义的404错误页。

一、错误的路径被发送到php-fpm进程

出现这类错误,十个有九个是后端fastcgi进程收到错误路径(SCRIPT_FILENAME),而后端fastcgi收到错误路径的原因大都是配置错误。

常见的nginx.conf的配置如下:

server {
    listen   [::]:80;
    server_name  example.com www.example.com;
    access_log  /var/www/logs/example.com.access.log;  

    location / {
        root   /var/www/example.com;
        index  index.html index.htm index.pl;
    }

    location /images {
        autoindex on;
    }

    location ~ .php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/example.com$fastcgi_script_name;
        include fastcgi_params;
    }
}

  

这个配置中有很多不合理的地方,其中一个明显的问题就是root指令被放到了location / 块。如果root指令被定义在location块中那么该root指令只能对其所在的location生效。其它locaiont中没有root指令,像location /images块不会匹配任何请求,需要在每个请求中重复配置root指令来解决这个问题。因此我们需要把root指令放在server块,这样各个location就会继承父server块定义的$document_root,如果某个location需要定义一个不同的$document_root,则可以在location单独定义一个root指令。

另一个问题就是fastCGI参数SCRIPT_FILENAME 是写死的。如果修改了root指令的值或者移动文件到别的目录,php-fpm会返回“No input file specified”错误,因为SCRIPT_FILENAME在配置中是写死的并没有随着$doucument_root变化而变化,我们可以修改SCRIPT_FILENAME配置如下:

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

 

所以我们不能忘记在server块中配置root指令,不然$document_root的值为空,只会传$fastcgi_script_name到php-fpm,这样就会导致“No input file specified”错误。

 

二、请求的文件真的不存在

当nginx收到一个不在的.php文件的请求时,因为nginx只会检查$uri是否是.php结尾,不会对文件是否存在进行判断,.php结尾的请求nginx会直接发给php-fpm处理。php-fpm处理时找不到文件就会返回“No input file specified”带着“404 Not Found”头。

解决办法

我们在nginx拦截不存在的文件,请求并返回自定义404错误

使用 try_files 捕捉不存在的urls并返回错误。

location ~ .php$ {
 try_files $uri =404;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME ....
 ...................................
 ...................................
}

  

 

上面的配置会检查.php文件是否存在,如果不存在,会返回404页面。

相关文章:

  • 微商代理系统APP软件
  • YAML基础语法
  • Spring深入理解(一)
  • MongoDB备份与恢复
  • Linux 用户 用户组 相关命令
  • Unity获取Android平台音量
  • 人工智能技术在中小学课堂中的应用
  • 设计模式入门:工厂方法模式
  • 作为app运营,你需要get的技能有哪些? 总结七项APP运营技能
  • Java分布式锁之数据库实现
  • Netty(二):数据在ChannelPipeline中的流经
  • 771. Jewels and Stones - LeetCode
  • 主磁盘分区和逻辑磁盘分区的区别是什么?
  • Android tab页制作
  • 纯前端表格技术应用研讨会——华为供应链专场
  • Docker: 容器互访的三种方式
  • HTTP--网络协议分层,http历史(二)
  • JAVA之继承和多态
  • jdbc就是这么简单
  • Map集合、散列表、红黑树介绍
  • Nodejs和JavaWeb协助开发
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • React-Native - 收藏集 - 掘金
  • vue.js框架原理浅析
  • XML已死 ?
  • Yii源码解读-服务定位器(Service Locator)
  • 基于webpack 的 vue 多页架构
  • 设计模式 开闭原则
  • 学习笔记:对象,原型和继承(1)
  • 自动记录MySQL慢查询快照脚本
  • kubernetes资源对象--ingress
  • PostgreSQL之连接数修改
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 阿里云重庆大学大数据训练营落地分享
  • ​渐进式Web应用PWA的未来
  • #ifdef 的技巧用法
  • $.ajax,axios,fetch三种ajax请求的区别
  • (1)Nginx简介和安装教程
  • (TOJ2804)Even? Odd?
  • (二)斐波那契Fabonacci函数
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (五)MySQL的备份及恢复
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转) 深度模型优化性能 调参
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net 提取注释生成API文档 帮助文档
  • .NET建议使用的大小写命名原则
  • .NET命令行(CLI)常用命令
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • [ C++ ] STL_list 使用及其模拟实现
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹