我将Moodle(moodle.org)从Apache主机移动到运行Nginx的Ubuntu 12.04 LTS主机。 主机设置的方式意味着它将运行不less域,其中每个域(或其他站点)将驻留在用户目录中。
我使用php5-fpm运行Nginx。 我发现在用户目录中运行php-fpm的configuration相当多,这一切都起作用。 然而,问题在于Moodle在PHP中大量使用了斜杠参数,导致许多url看起来像这样:
/home/[user]/public_html/theme/image.php/standard/theme/1377637305/favicon
我正在运行这个Nginxconfiguration:
server { #listen 80; ## listen for ipv4; this line is default and implied #listen [::]:80 default ipv6only=on; ## listen for ipv6 root /usr/share/nginx/www; index index.html index.htm index.php; # Make site accessible from http://localhost/ server_name localhost; location / { # First attempt to serve request as file, then # as directory, then fall back to index.html try_files $uri $uri/ /index.html; # Uncomment to enable naxsi on this location # include /etc/nginx/naxsi.rules } location /doc/ { alias /usr/share/doc/; autoindex on; allow 127.0.0.1; deny all; } location ~ ^/~(?<userdir_user>.+?)(?<userdir_uri>/.*)?$ { alias /home/$userdir_user/public_html$userdir_uri; index index.html index.htm index.php; autoindex off; ## to allow autoindex a la apache include php5_generic; } } ## php5_generic location ~ \.php { fastcgi_split_path_info ^(.+\.php)(/.*)$; # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini # With php5-cgi alone: fastcgi_pass 127.0.0.1:9000; # With php5-fpm: # fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; }
我遇到的问题是这个configuration对普通的php文件起作用,但对于使用斜杠参数的HTTP GET请求不起作用。 Nginx的错误日志报告说,PHP的FMP提出的错误就像那里:
*615 open() "/home/[user]/public_html/theme/image.php/standard/core/1377637305/moodlelogo" failed (20: Not a directory),
要么
5 FastCGI sent in stderr: "Access to the script '/home/[user]/public_html/lib/javascript.php/1377637305/lib/javascript-static.js' has been denied (see security.limit_extensions)"
这里怎么了?
在http://wiki.nginx.org/PHPFcgiExample上使用示例configuration作为基础之后,我find了一个解决scheme。 这个解决scheme还build议(与许多其他示例相反)将php.ini中的cgi.fix_pathinfo设置保留为1。
我没有去完整的user_dir解决scheme,而是去了一个硬编码的解决scheme,因为我还不知道如何使$ userdir_uservariables在随后的正则expression式中工作。
第二个要注意的是fastcgi_split_path_info的修复。 原因是,否则〜用户部分被翻译成给PHP的path。
server { index index.php index.html index.htm; location ~ ^/~user(?<userdir_uri>/.*)?$ { alias /home/user/public_html$userdir_uri; #autoindex on; #If this doesn't work, set cgi.fix_pathinfo=1 in /etc/php5/fpm/php.ini location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^/~user/(.+?\.php)(/.*)$; include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; } } }