Nginx $document_root$fastcgi_script_name 与 $request_filename

Mul*_*gno 19 nginx web-server fastcgi

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

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
Run Code Online (Sandbox Code Playgroud)

或者:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;
Run Code Online (Sandbox Code Playgroud)

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

提前致谢。

Sim*_*ity 30

以下是文档中的内容:

$request_filename

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

$document_root

该变量等于当前请求的指令 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;
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*ing 13

TLDR

我推荐$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;
    }
}
Run Code Online (Sandbox Code Playgroud)

请求/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将不起作用。