记:痛苦的排错之” No input file specified.“

报错 ”No input file specified.“ 排查

背景

今天下午我要和小伙伴一起开发一个 Laravel 的项目,这个项目是我伙伴已经开发了一部分,所有我就克隆了一份到我的电脑上,但是等我配置好,打开网址的提示 ”No input file specified.“ 404错误

排查

  • 首先我怀疑是项目源代码的问题,然后我直接在入口文件最前面添加了一句如下;我访问网址还是报同样的错误。

    <?php
    exit(1);

    说明不是我项目源代码的问题,排除代码的问题;

  • 我开始怀疑是自己环境的问题,于是我就开始折腾了。我把项目删了,又从新开始建一个项目,但是还是不行。我发现只有这个项目是这样的问题。于是我确定不是环境的问题。

    说明不是环境的问题,排除环境的问题

  • 我百度了一下,有人说可能是 Homestead.yaml 的问题,但是我仔细对照了一边,我也没有发现的那里出问题了。于是我就 Google 了一下,也没有找到好的原因。

    排除虚拟机配置的问题

  • 于是我就再想不是环境的问题,不是程序的问题~~~;最后觉得应该去虚拟机里面看看,最后我在 ngnix 的日志中看到这个错误。

    2019/05/23 12:31:44 [error] 5085#5085: *1 FastCGI sent in stderr: "PHP message: PHP Warning:  Unknown: open_basedir restriction in effect. File(/home/vagrant/Code/haopai-git/public/index.php) is not within the allowed path(s): (/www/wwwroot/dev.guooo.top/:/tmp/:/proc/) in Unknown on line 0
    PHP message: PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on line 0
    Unable to open primary script: /home/vagrant/Code/haopai-git/public/index.php (Operation not permitted)" while reading response header from upstream, client: 192.168.10.1, server: hp.hopa.cc, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:", host: "hp.hopa.cc"
  • 看到上面的错误,我也去网上找,网上主要是说 ngnix 里面配置 fastcgi_param 的问题,但是我觉得不对吧,因为别的项目都没有问题,单单就这个项目有问题。不知怎么了,我就注意到 "/www/wwwroot/" 这个东西,我电脑里就不应该有这个文件夹啊,于是我就去项目里查找这个字符串,最后在 .user.ini 这个文件找到了,当我看到这个文件的时候我就意识到是他的问题,我把这个文件里面的配置删了。文件内容如下:

    open_basedir=***********
  • 好了,问题解决了。

    反思

    之后回过头来想想,其实一开始就应该想到去看看 ngnix 的日志。之前也接触过 .user.ini 这个文件,那时只记得他是防治跨站攻击用的。

    .user.ini 知识点

    自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用 .htaccess 文件有同样效果。

    除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。

    在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 4年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 11
LOST

哈哈,这问题我也遇到过。

4年前 评论
你看我吊吗啊

昨天还遇到过。。

4年前 评论
聪聆

前几天用到了这个问题,我将public目录内容备份之后,全部删除。
然后自己写个index.php, 没问题。
然后把原来的index.php 覆盖掉,没问题。
然后把文件夹一个个放进去没问题,最后放user.ini出错。
单独拿出来研究了下,说是对nginx的配置修改的东东,删掉就好~ :joy:

4年前 评论

ngnix 的日志在哪里?Thanks♪(・ω・)ノ

4年前 评论

.user.ini 类似 php.ini,是 PHP 的配置文件,它们具有一些同样的参数,但作用域不同。

作者博客中提到的:那时只记得他是防治跨站攻击用的 是不准确的。其实是其中的 open_basedir 参数具有一定防止「在同一台主机上部署多台虚拟主机」时恶意跨站的作用。

4年前 评论

我现在遇到这个问题了,尴尬呢,不知道怎么处理

4年前 评论

卧槽,最近几天刚遇到,兄弟,救了我一条狗命,6666666.

2年前 评论

也遇到了,跟着做解决了 :+1:

2年前 评论
OrangBus

真是坑爹,别人在 laravel/public 创建了一个html静态项目,估计是直接复制粘贴过去的,该文件没有删除,搞了老半天

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!