nginx、php-fpm 和多个根 - 如何正确地 try_files?

nginx、php-fpm 和多个根 - 如何正确地 try_files?

我有一个服务器上下文,它植根于登录应用程序。登录应用程序处理登录,然后如果登录成功,则返回到同一服务器上的“/app”的重定向。该应用程序植根于其他地方,由此处显示的位置块处理:

location ^~ /app {
        alias /usr/share/nginx/www/website.com/content/public;
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_pass unix:/tmp/php5-fpm.sock;
                include fastcgi_params;
        }
}

运行正常,但是传递给 PHP 的 $uri 仍然包含/app,尽管我使用的是别名而不是 root。因此,除非我链接 ,否则该try_files指令将失败。404app -> .//usr/share/nginx/www/website.com/content/public

显然,在那里保留这个链接是愚蠢的,而且如果这个链接丢失,网站就会毫无原因地死亡。

我接下来尝试的是……

是完全删除该try_files指令。这允许我在我的文件夹中链接rm,并且 PHP 可以毫无问题地找到文件并执行它。我使用它从 PHP 转储我的全局变量,并发现当浏览器 URI 为 时。app/public$_SERVER"SCRIPT_FILENAME" => "/usr/share/nginx/www/website.com/content/public/index.php"/app

这完全正确根据我的fastcgi_params以下描述,这让我相信try_files $request_filename =404;应该可以工作,但没有成功。nginx 仍然找不到该文件,并返回 404。

因此目前,它只能在没有任何try_files指令的情况下工作。PHP 可以找到该文件,而 try_files 却找不到。我知道这可能是 PHP 安全风险。有人能指出如何继续吗?据我所知,nginx 日志不包含与失败的 try_files 尝试相关的任何内容。

fastcgi_aparams

fastcgi_param   QUERY_STRING        $query_string;
fastcgi_param   REQUEST_METHOD      $request_method;
fastcgi_param   CONTENT_TYPE        $content_type;
fastcgi_param   CONTENT_LENGTH      $content_length;

fastcgi_param   SCRIPT_FILENAME     $request_filename;
fastcgi_param   SCRIPT_NAME     $fastcgi_script_name;
fastcgi_param   REQUEST_URI     $request_uri;
fastcgi_param   DOCUMENT_URI        $document_uri;
fastcgi_param   DOCUMENT_ROOT       $document_root;
fastcgi_param   SERVER_PROTOCOL     $server_protocol;

fastcgi_param   GATEWAY_INTERFACE   CGI/1.1;
fastcgi_param   SERVER_SOFTWARE     nginx/$nginx_version;

fastcgi_param   REMOTE_ADDR     $remote_addr;
fastcgi_param   REMOTE_PORT     $remote_port;
fastcgi_param   SERVER_ADDR     $server_addr;
fastcgi_param   SERVER_PORT     $server_port;
fastcgi_param   SERVER_NAME     $server_name;

fastcgi_param   HTTPS           $server_https;

答案1

为了使其工作,fastcgi_param SCRIPT_FILENAME $request_filename需要在位置块中进行复制,如下所示:

location ^~ /app {
        alias /usr/share/nginx/www/website.com/content/public;
        location ~ \.php$ {
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $request_filename;

                fastcgi_pass unix:/tmp/php5-fpm.sock;
                try_files $uri =404; 
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
                fastcgi_split_path_info         ^(.+\.php)(/.+)$;
                fastcgi_index               index.php;
        }
}

这是因为在包含的配置文件中,$request_filename 不会反映新的别名,这是由于 nginx 如何在级别之间继承配置值。

答案2

检查您的 fastcgi_params。最有可能的是,您的 SCRIPT_FILENAME 定义为 $document_root$fastcgi_script_name,它明确告诉它不要考虑别名($document_root 部分是显式部分)

如果您想在 PHP 中使用别名,您可能应该将 SCRIPT_FILENAME 定义为 $request_filename,其中会将别名考虑在内。

相关内容