我正在将旧的 Apache 服务器转换为 Nginx,并且没有更改 URL 或重新排列文件系统的奢侈。
是否可以在 Nginx 配置中使用嵌套的 location{} 块来告诉它在正常提供静态内容的同时将别名目录中的 .php 文件提供给 fastcgi?
与我失败的类似配置:
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 在尝试将它们分派到 fastcgi 时似乎会混淆任何 .php 文件的路径。
此处提供的解决方案不是解决方案。而且它不再正确了。使用 Lucid (10.4) 我能够使用这个解决方案。womble的解决方案的问题是它没有
DOCUMENT_ROOT
正确设置参数;相反,它在 document_root 中包含脚本名称。这似乎工作正常。
使用
nginx/0.7.65
据我所知,您所说的“乱码”是 nginx 中与嵌套位置块相关的错误(或者可能是位置块中的别名,它们在没有捕获的情况下进行基于正则表达式的匹配......我不确定) . 然而,我能够做的事情相当简单。
首先,你可以把你所有的 fastcgi 参数,包括
fastcgi_pass
行和fastcgi_param SCRIPT_FILENAME $request_filename
放入一个单独的文件中,以便包含在站点的相关部分中。我把我的放进去/etc/nginx/fragments/php
。然后,对于
/foosite
,您需要两个位置块,如下所示:这里要提防的一件事-与“常规”位置块不同,基于正则表达式的匹配似乎按照配置文件中指定的顺序运行(不是最长匹配优先,就像非正则表达式的情况一样位置块)。因此,如果您正在处理特定于站点的 PHP 位置,以及通用的“全站点”PHP 处理程序 (
location ~ \.php$
),那么您需要将通用的“全站点”处理程序放在服务器块的最后,或者所有的地狱都会崩溃。是的,这很糟糕,如果我有动力,我可能会尝试找出嵌套案例到底出了什么问题(配置解析器不会对它吐槽,所以我怀疑它应该可以工作,但实际上没有人使用它,所以它是越野车)。
AFAIK,您不能使用嵌套块。
请尝试以下类似的方法。
您可以将第二个块修改为类似
(需要测试)