Nginx $ document_root $ fastcgi_script_name与$ request_filename


16

如果在我的配置文件中设置,我不会注意到任何区别

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

要么:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

他们分别做什么?两者之一比另一个更好吗?

提前致谢。

Answers:


24

文档说明如下:

$ request_filename

此变量等于当前请求文件的路径,该路径由指令root或别名和URI请求构成;

$ document_root

该变量等于当前请求的指令根的值;

$ fastcgi_script_name

此变量等于URI请求,或者,如果URI以正斜杠结尾,则该URI请求加上fastcgi_index给出的索引文件的名称。可以代替SCRIPT_FILENAME和PATH_TRANSLATED来使用此变量,特别是用于确定PHP中脚本的名称。

如此处所述,使用fastcgi_indexfastcgi_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


这似乎不正确(至少现在不再如此)。参见斯蒂尔·温的答案。
Rimas Kudelis

@RimasKudelis我已经有一段时间没有使用它了,但是文档没有更改,因此我希望它仍然可以工作-也许您fastcgi_split_path_info需要进行调整。Steely Wing的答案似乎完全基于经验,而不是文档。
SimonSimCity

是的,我的评论也基于经验。我试图fastcgi_split_path_info通过将别名前缀放在两次捕获之外来进行调整以排除别名前缀,但是它似乎没有任何作用。不管是否涉及别名,传递$request_filenameas都SCRIPT_FILENAME像一个符咒一样起作用。
Rimas Kudelis

实际上,我不明白为什么NginX文档甚至建议SCRIPT_FILENAME$request_filename包含实际文件名的情况下,首先将两个字符串连接起来形成形式,而不附加任何额外内容。上面的示例实际上是不正确的,因为$request_filename即使没有显式请求该文件,实际上它确实包含一个文件名而不是一个路径。至少那是我截至昨天的结论。
Rimas Kudelis

7

TLDR

我建议$request_filename用于SCRIPT_FILENAME


如果您使用root指令

$document_root$fastcgi_script_name等于$request_filename

如果您使用alias指令

$document_root$fastcgi_script_name会返回错误的路径,因为$fastcgi_script_nameURL的路径,而不是与的路径有关$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将无法正常工作。


2

我猜这些行是从“ 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/

我希望它对将来的任何人都有用,因为我花了很多时间才弄清楚。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.