首页 > nginx > nginx File not found 错误

nginx File not found 错误

2012年12月21日 发表评论 阅读评论

使用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的配置如下:

 

这个配置中有很多不合理的地方,其中一个明显的问题就是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并返回错误。

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

分类: nginx 标签:
  1. TDX
    2018年12月27日13:27 | #1

    非常感谢,对nginx配置文件加深了了解

  2. 2018年3月21日06:31 | #2

    感谢。

  3. aaa
    2018年1月25日17:25 | #3

    感谢

  4. hello
    2017年9月19日21:39 | #4

    感谢

  5. Lyon
    2017年4月12日17:26 | #5

    牛鼻

  6. gz
    2017年2月24日14:53 | #6

    狂赞。。。很不错呢,,讲的十分到位,,按照你说的来,解决了问题

  7. 2016年4月1日10:17 | #7

    怒赞

  8. Lv.4
    2016年3月2日20:42 | #8

    帮助解决了问题!!!!!抛出异常的感谢!!!!

  9. 123
    2016年1月5日14:08 | #9

    感谢

  10. 2015年1月1日17:38 | #10

    非常感谢,解决了我的问题

  11. 2014年5月13日19:06 | #11

    找了好多, 看了你的才知道到底是什么问题 谢谢

  12. 2014年4月25日20:24 | #12

    还有一个可能是权限问题 php-fpm没有打开指定路径文件的权限

    • 2014年4月27日10:05 | #13

    • euii
      2014年7月28日17:44 | #14

      多谢,因为看了你这一条的消息,才让我解决了问题。

    • john
      2015年6月12日22:23 | #15

      很好,你的这条答案应该被作者采纳。解决了我的问题。

  13. hizzx
    2014年2月10日17:02 | #16

    谢谢你,

    感觉你分享这个信息,解决了我的问题。

    再次感谢。

  14. 2014年1月4日13:40 | #17

    真心赞,直指问题所在,帮我解决了,多谢!

  15. 2013年12月9日00:03 | #18

    我的文件真实存在的啊,还说找不到

  16. WilliamHu
    2013年11月24日11:20 | #19

    这个很赞!

  17. xiaoxin
    2013年9月21日16:42 | #20

    谢谢,解决了我的问题。

  18. delphi
    2013年7月5日10:05 | #21

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

    解决了我的问题啊,

  19. jiang
    2013年6月3日08:38 | #23

    谢谢。。。非常感谢

  20. 2013年3月2日16:26 | #24

    网络中那么多, 你是讲得最清楚, 最明白的

  1. 2013年12月31日14:02 | #1
  2. 2014年7月24日11:49 | #2
  3. 2016年2月28日16:45 | #3
  4. 2017年6月13日00:55 | #4
  5. 2017年8月14日19:19 | #5