我讨厌配置 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;
}