当路由是PHP文件时,页面将显示错误。未指定输入文件

时间:2018-12-12 06:59:30

标签: nginx laravel-5

我的环境如下:

  • Linux版本4.4.0-105-通用(buildd @ lgw01-amd64-060)(gcc版本 5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1〜16.04.5))#128-Ubuntu SMP 12月14日星期四12:42:11 UTC 2017
  • Nginx版本:nginx / 1.14.1
  • PHP 7.2.13(cli)(内置:2018年12月7日16:36:58)(NTS)
  • Laravel 5.6

出于历史原因,我不得不使用a.php作为项目的路由。

当我在配置完成后尝试访问a.php时,页面显示:未指定输入文件。

当我访问非PHP文件的路由时,它将显示laravel的404页面,这是正确的,因为我没有设置此路由

所以我认为问题是路由在php文件中。转发路由时,似乎有一些我不知道的问题。不幸的是,我无法解决。

我的nginx配置如下:

    server {
            listen   80; ## listen for ipv4; this line is default and implied
            listen   [::]:80 default ipv6only=on; ## listen for ipv6

            root /var/www/html/public;
            index index.html index.htm index.php;

            # Make site accessible from http://localhost/
            server_name _;

            # Disable sendfile as per https://docs.vagrantup.com/v2/synced-folders/virtualbox.html
            sendfile off;

            # Add stdout logging
            error_log /dev/null;
            access_log /dev/null;

            #static rewrite or try_files

            #core route redirect
            location / {
                try_files $uri $uri/ /index.php?$query_string;
            }

            error_page 404 /404.html;
            location = /404.html {
                    root /var/www/html/public;
                    internal;
            }

            # pass the PHP scripts to FastCGI server listening on socket
            location ~ \.php$ {
                    #include fastcgi_params;
                    fastcgi_param QUERY_STRING  $query_string;
                    fastcgi_param REQUEST_METHOD  $request_method;
                    fastcgi_param CONTENT_TYPE  $content_type;
                    fastcgi_param CONTENT_LENGTH  $content_length;
                    #fastcgi_param SCRIPT_FILENAME  $request_filename;
                    fastcgi_param SCRIPT_NAME  $fastcgi_script_name;
                    fastcgi_param REQUEST_URI  $request_uri;
                    fastcgi_param DOCUMENT_URI  $document_uri;
                    fastcgi_param DOCUMENT_ROOT  $document_root;
                    fastcgi_param SERVER_PROTOCOL  $server_protocol;
                    fastcgi_param GATEWAY_INTERFACE CGI/1.1;
                    fastcgi_param SERVER_SOFTWARE  nginx/$nginx_version;
                    fastcgi_param REMOTE_ADDR  $remote_addr;
                    fastcgi_param REMOTE_PORT  $remote_port;
                    fastcgi_param SERVER_ADDR  $server_addr;
                    fastcgi_param SERVER_PORT  $server_port;
                    fastcgi_param SERVER_NAME  $server_name;
                    fastcgi_param HTTPS   $https if_not_empty;
                    fastcgi_param REDIRECT_STATUS  200;
                    fastcgi_param HTTP_PROXY  "";

                    fastcgi_split_path_info ^(.+\.php)(/.+)$;
                    fastcgi_pass 127.0.0.1:9000;
                    fastcgi_index index.php;
                    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
            }

            location ~* \.(jpg|jpeg|gif|png|css|js|ico|webp|tiff|ttf|svg)$ {
                    expires 2d;
            }
    }

我尝试将php.ini中的cgi.fix_pathinfo的值修改为1

然后错误变为:找不到文件

似乎没有效果

此外,我的本地环境是正常的,但是我在本地使用valet,它集成了nginx并进行了一些更改,我无法比较其配置和在线环境之间的差异。

2 个答案:

答案 0 :(得分:0)

如果URI与本地文件不对应,则您的try_files块中有一个location /语句,该语句然后发送到Laravel控制器(index.php)。

.php结尾的URI由location ~ \.php$块处理。

如果您还希望将以.php结尾的与本地脚本文件不对应的URI也发送到Laravel控制器,请在该块中也添加一个try_files语句。

例如:

location ~ \.php$ {
    try_files $uri /index.php?$query_string;
    ...
}

答案 1 :(得分:0)

昨天我通过以下方法解决了这个问题。

if (!-e $request_filename)
{
     Rewrite ^/(.*)$ /index.php?/$1 last;
     Break;
}

但是,我认为您的答案更合理。@ Richard Smith