如果在我的配置文件中设置,我不会注意到任何区别
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
要么:
fastcgi_param SCRIPT_FILENAME $request_filename;
他们分别做什么?两者之一比另一个更好吗?
提前致谢。
如果在我的配置文件中设置,我不会注意到任何区别
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
要么:
fastcgi_param SCRIPT_FILENAME $request_filename;
他们分别做什么?两者之一比另一个更好吗?
提前致谢。
Answers:
文档说明如下:
此变量等于当前请求文件的路径,该路径由指令root或别名和URI请求构成;
该变量等于当前请求的指令根的值;
此变量等于URI请求,或者,如果URI以正斜杠结尾,则该URI请求加上fastcgi_index给出的索引文件的名称。可以代替SCRIPT_FILENAME和PATH_TRANSLATED来使用此变量,特别是用于确定PHP中脚本的名称。
如此处所述,使用fastcgi_index或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
fastcgi_split_path_info
需要进行调整。Steely Wing的答案似乎完全基于经验,而不是文档。
fastcgi_split_path_info
通过将别名前缀放在两次捕获之外来进行调整以排除别名前缀,但是它似乎没有任何作用。不管是否涉及别名,传递$request_filename
as都SCRIPT_FILENAME
像一个符咒一样起作用。
SCRIPT_FILENAME
在$request_filename
包含实际文件名的情况下,首先将两个字符串连接起来形成形式,而不附加任何额外内容。上面的示例实际上是不正确的,因为$request_filename
即使没有显式请求该文件,实际上它确实包含一个文件名而不是一个路径。至少那是我截至昨天的结论。
我建议$request_filename
用于SCRIPT_FILENAME
。
root
指令$document_root$fastcgi_script_name
等于$request_filename
。
alias
指令$document_root$fastcgi_script_name
会返回错误的路径,因为$fastcgi_script_name
URL的路径,而不是与的路径有关$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
将无法正常工作。
我猜这些行是从“ fastcgi_params”文件中提取的。
基本上,您不会遇到任何错误, SCRIPT_FILENAME
因为在vhost文件中定义根指令时已经定义了它。因此,除非您在vhost文件中使用fastcgi_param
的值显式定义了它,否则SCRIPT_FILENAME
将从root指令中获取它。但是这里有一个重要点。nginx还需要另一个变量,以便将请求发送到php服务器,$fastcgi_script_name
您必须对其进行正确定义,以避免重复的URL和uri以斜杠结尾的错误。
结论:
为了使一切都变得超级漂亮,每个人都应该SCRIPT_FILENAME
在/ etc / nginx文件夹中的“ fastcgi_params”文件中进行显式定义,或者在php位置块中包含以下行,从而轻松地在位于sites-available文件夹中的站点的虚拟主机中进行定义:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
或包含在您上面编写的“ fastcgi_params”文件中,无论哪种方式都相同。有关将ngnix连接到PHP-FPM的更多信息,请访问:
https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/
我希望它对将来的任何人都有用,因为我花了很多时间才弄清楚。