我有几个PHP站点,我想根据权限分开。 因此,我创build了一个新用户并为这些用户设置了一个PHP池。 考虑下面的configuration:
php身份运行 nginx身份运行 /srv/http ,可以通过php和nginx访问。 /srv/http/index.php文件可以被php读取,但不能被nginx读取。 fastcgi_stuff文件包含用于设置标题,设置后端等的基本fastcgi参数。假设静态文件和PHP文件的webroot是相同的。 下面的nginx.conf包含了这个configuration的要点,它被放置在一个server指令中:
server_name example.com; root /srv/http; index index.php; location ~ \.php$ { include fastcgi_stuff; }
如果我通过上述configuration请求http://example.com/ ,则按预期加载页面。 对于http://example.com/does.not.exist ,我得到了预期的404。
为了防止将不存在的文件传递给PHP-FPM,我尝试添加下面的一行:
try_files $uri =404; if ( !-e $request_filename ){ return 404; }
两者都不像广告一样工作,它试图打开文件,而不是通过执行stat()调用来检查存在。 我通过检查源代码并在工作进程上运行strace来确认这一点。
这是我遇到的一个基本情况,另一个案例是我隐藏扩展,因此把一个try_files $uri.php =404在位置块。 有什么build议么?
Nginx试图打开文件,因为我有disable_symlinks on; 。 相关的源代码位于core / ngx_open_file_cache.c,函数ngx_file_info_wrapper 。 (从ngx_http_script_file_code ngx_open_cached_file调用)。
如果disable_symlinks被设置为off ,nginx会进行一个简单的统计调用( ngx_file_info被ngx_file_info为* nix上的stat信息)。 当disable_symlinks设置为别的(例如on )时,它会尝试以一种对symlink races安全的方式打开文件,然后对打开的文件描述符执行fstat()调用。 由于nginx 无法打开文件进行读取,因此无法读取文件。
短期的解决方法是使用disable_symlinks off再次启用符号链接 ,一个长期的解决scheme是修改函数来遍历包含的目录,然后fstatat()该目录中的文件。 请记住,对于不包含PHP脚本但可由PHP用户写入的目录禁用符号链接。
正如http://forum.nginx.org/read.php?2,225152,234724#msg-234724中提到的那样,此行为被logging在案 :
在不支持仅search打开目录的系统上,使用这些参数要求工作进程对所有检查的目录具有读取权限。
我已经上传了一个补丁 ,允许您限制符号链接,并仍然使try_files或if工作。 另请参阅上面的链接线程。