我正在将一个传统的Apache服务器转换成Nginx,并没有改变URL或重新安排文件系统的好处。
是否可以在Nginxconfiguration中使用嵌套的位置块来告诉它将正在提供静态内容的别名目录中的.php文件提供给fastcgi?
类似的configuration让我失望:
server { listen 80; location / { index index.html; } location /foosite/ { alias /var/aliases/foo; location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } }
/foosite/static.jpg的请求服务正常,但nginx似乎试图派遣他们到fastcgipath到任何.php文件。
这里提供的解决scheme不是解决scheme。 而且这是不正确的了。 使用Lucid(10.4)我能够使用这个解决scheme。 womble的解决scheme的问题是它没有正确设置DOCUMENT_ROOT参数; 相反,它包含document_root中的脚本名称。
这似乎工作确定。
location /foosite { alias /home/foosite/www/; index index.php index.html index.htm; location ~ /foosite/(.*\.php)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$1; include /etc/nginx/fastcgi_params; } }
使用nginx/0.7.65
你所说的“garbling”,据我所知,是一个与嵌套位置块有关的nginx中的错误(或者是在没有捕获的情况下做基于正则expression式匹配的位置块中的别名……我不确定) 。 然而,我所能做到的却相当简单。
首先,您可以将所有的fastcgi参数(包括fastcgi_pass行和fastcgi_param SCRIPT_FILENAME $request_filename放入单独的文件中,以包含在网站的相关部分中。 我把它放在/etc/nginx/fragments/php 。
那么, /foosite ,你需要两个位置块,如下所示:
location /foosite { alias /var/aliases/foo; } location /foosite(.*\.php)$ { alias /var/aliases/foo$1; include /etc/nginx/fragments/php; }
有一点需要注意的是,与“常规”位置块不同,看来基于正则expression式的匹配按configuration文件中指定的顺序运行(不是最长匹配优先,非正则expression式位置块)。 因此,如果您正在执行特定于站点的PHP位置以及通用的“全站点”PHP处理程序( location ~ \.php$ ),那么您需要将通用“全站点”处理程序作为最后一个在服务器块中,或者所有的地狱都会打散。
是的,这很糟糕,如果我得到了动机,我可能会试着弄清楚嵌套的情况到底是怎么回事(configurationparsing器不会禁用它,所以我怀疑它应该工作,但没有人真正使用它,所以它是越野车)。
AFAIK,你不能使用嵌套块。
试试像下面这样的东西。
location / { root /var/www; access_log off; index index.php index.html; expires 1d; try_files $uri $uri/ /index.php?q=$uri; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name; include /usr/local/nginx/conf/fastcgi_params; }
你可以修改第二个块是类似的
location ~ /foosite/.*php$
(需要testing)