我有一个服务器上下文,它植根于登录应用程序。登录应用程序处理登录,然后如果登录成功,则返回到同一服务器上的“/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
指令将失败。404
app -> ./
/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,其中会将别名考虑在内。