我有一个根源于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_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,这个名称会考虑别名。