如果需要PATH_INFO

如果需要PATH_INFO

如果我在我的配置文件中设置

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

或者:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

它们分别起什么作用?哪一个比另一个更好?

提前致谢。

答案1

文档内容如下:

$请求文件名

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

$document_root

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

$fastcgi_script_name

此变量等于 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/

我希望它能够对未来的任何人有所帮助,因为我花了很多时间才弄清楚......

相关内容