nginx,php-fpm和多个根 – 如何正确try_files?

我有一个根源于login应用程序的服务器上下文。 如果login成功,login应用程序会处理login,然后在同一台服务器上将redirect返回到“/ 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 ,尽pipe我使用的是别名而不是root。 正因为如此, try_files指令不能成为404除非我在/usr/share/nginx/www/website.com/content/public链接app -> ./

在那里build立链接显然是愚蠢的,如果这个链接永远丢失了,那么没有明显原因的网站就会死掉。

接下来我尝试了…

是完全删除了try_files指令。 这使我可以在我的/public文件夹中的app链接,PHP没有问题的位置和执行文件。 我用它来从PHP中转储我的$_SERVER全局,当浏览器URI是/app时,发现"SCRIPT_FILENAME" => "/usr/share/nginx/www/website.com/content/public/index.php" /app "SCRIPT_FILENAME" => "/usr/share/nginx/www/website.com/content/public/index.php" /app "SCRIPT_FILENAME" => "/usr/share/nginx/www/website.com/content/public/index.php"

这是完全正确的 。 基于我的fastcgi_params下面,这使我相信try_files $request_filename =404; 应该工作,但没有骰子。 nginx仍然没有find该文件,并返回404。

所以现在,它只会在没有任何try_files指令的情况下工作。 PHPfind文件,而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; 

为了使其工作, 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; } } 

这是因为在包含的configuration文件中,$ request_filename不会反映新的别名,这是由于nginxinheritance了级别之间的configuration值。

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

如果你想在PHP中使用别名,你应该将SCRIPT_FILENAME定义为$ request_filename,这个名称会考虑别名。