如果我在我的配置文件中设置
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
或者:
fastcgi_param SCRIPT_FILENAME $request_filename;
它们分别起什么作用?哪一个比另一个更好?
提前致谢。
答案1
文档内容如下:
该变量等于当前请求的文件路径,由指令根或别名和 URI 请求组成;
该变量等于当前请求的指令根的值;
此变量等于 URI 请求,或者,如果 URI 以正斜杠结尾,则等于 URI 请求加上 fastcgi_index 给出的索引文件的名称。可以使用此变量代替 SCRIPT_FILENAME 和 PATH_TRANSLATED,特别是用于确定 PHP 中的脚本名称。
正如这里所写,使用时至少有区别fastcgi_索引或者fastcgi_split_path_info。也许还有更多……这是我目前所知道的。
例子
您收到请求/info/
并具有以下配置:
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;
SCRIPT_FILENAME
会相等/home/www/scripts/php/info/index.php
,但使用$request_filename
它会只是/home/www/scripts/php/info/
。
配置fastcgi_split_path_info
也很重要。请参阅此处获取更多帮助:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info
答案2
如果需要PATH_INFO
如果需要PATH_INFO
(URI类似/index.php/search
),您需要使用$document_root$fastcgi_script_name
,因为fastcgi_split_path_info
不能使用$request_filename
如果使用root
指令
$document_root$fastcgi_script_name
等于$request_filename
。
如果使用alias
指令
$document_root$fastcgi_script_name
将返回错误的路径,因为$fastcgi_script_name
是 URI 的路径,而不是与之相关的路径$document_root
。
例子
location /api/ {
index index.php index.html index.htm;
alias /app/www/;
location ~* "\.php$" {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# fastcgi_param SCRIPT_FILENAME $request_filename;
}
}
要求/api/testing.php
:
$document_root$fastcgi_script_name
==/app/www//api/testing.php
$request_filename
==/app/www/testing.php
要求/api/
:
$document_root$fastcgi_script_name
==/app/www//api/index.php
$request_filename
==/app/www/index.php
并且如果您使用$request_filename
,则应该使用index
指令设置索引,fastcgi_index
否则将不起作用。
答案3
我猜这些行是从“fastcgi_params”文件中获取的。
基本上,您不会收到任何错误,因为 SCRIPT_FILENAME
在 vhost 文件中定义 root 指令时它已经定义。因此,除非您在 vhost 文件中明确定义它,否则使用fastcgi_param
的值SCRIPT_FILENAME
将从 root 指令中获取。但这里有一个重点。nginx 需要另一个变量才能将请求发送到 php 服务器,$fastcgi_script_name
您必须很好地定义它,以避免重复的 URL 和以斜杠结尾的 uri 的错误。
结论:
为了让一切都运行良好,每个人都应该SCRIPT_FILENAME
在位于 /etc/nginx 文件夹中的“fastcgi_params”文件中明确定义,或者在位于 sites-available 文件夹中的站点 vhost 中通过在 php 位置块中包含以下行来轻松定义:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
或者像上面写的那样包含在“fastcgi_params”文件中,无论哪种方式都是一样的。有关将 ngnix 连接到 PHP-FPM 的更多信息,请访问:
https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/
我希望它能够对未来的任何人有所帮助,因为我花了很多时间才弄清楚......