nginx fastcgi 配置 userdir 时出现“主要脚本未知”

nginx fastcgi 配置 userdir 时出现“主要脚本未知”

我讨厌配置 nginx。它太复杂了。如何让 PHP 在我的用户目录中工作?这是我的 nginx.conf 的相关部分:

    location ~ ^/~(.+?)(/.*)?$ {
        autoindex on;
        autoindex_exact_size off;
        alias /home/$1/public_html$2;

        location ~ \.php {
            include /etc/nginx/fastcgi.conf;
            fastcgi_intercept_errors on;
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
        }
    }

这给了我错误:FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream在 nginx 错误日志中。

这是我的/etc/nginx/fastcgi.conf

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
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_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  HTTPS              $https if_not_empty;

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;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

我假设 nginx 无法正确解析脚本名称。我讨厌必须告诉 nginx 在我的文件系统中查找什么,为应该内置(或至少标准化和记录)的功能编写自定义正则表达式。

答案1

问题是,您在 fastcgi.conf 中定义SCRIPT_FILENAME为,$document_root$fastcgi_script_name;但随后使用alias指令来设置路径。

您应该更新您的SCRIPT_FILENAME以使用$request_filename

如果您愿意,也可以返回嵌套位置。如果之后您仍然收到此错误,那么我已在此处记录了所有可能性:https://blog.martinfjordvald.com/no-input-file-specified-with-php-and-nginx/

请检查,因为可能还有多种其他原因。

答案2

当您在 nginx 中定义重定向、别名并在站点的 conf 中使用 fastcgi 时,您可以尝试这样做以让它们工作:

改变:

位置 ~ \.php$ {
...
fastcgi_param SCRIPT_FILENAME$document_root$fastcgi_script_name;
...
}


进入:

位置 ~ \.php$ {
...
fastcgi_param SCRIPT_FILENAME$请求文件名;
fastcgi_参数 请求URI $uri?$args;
...
}

如果这不起作用,请尝试使用上面提到的不带 REQUEST_URI 的方法,这样将会是:

位置 ~ \.php$ {
...
fastcgi_param SCRIPT_FILENAME$请求文件名;
...
}

答案3

尝试location在用户目录中为 PHP 脚本使用单独的块。这不需要嵌套。

location ~ ^/~([^/]+)/(.+\.php)$ {
    alias /home/$1/public_html/$2;
    include /etc/nginx/fastcgi.conf;
    fastcgi_intercept_errors on;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
}

相关内容