我正在将旧的 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 文件的路径。
答案1
这里提供的解决方案不是一个解决方案。而且它不再正确。使用 Lucid (10.4),我能够使用此解决方案。womble 的解决方案的问题在于它没有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
答案2
据我所知,您所说的“乱码”是 nginx 中的一个错误,与嵌套位置块有关(或者可能是位置块中的别名,它们在没有捕获的情况下执行基于正则表达式的匹配……我不确定)。但是,我能做的相当简单。
首先,您可以将所有 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;
}
这里需要注意的一点是——与“常规”位置块不同,基于正则表达式的匹配似乎按照配置文件中指定的顺序运行(而不是最长匹配优先,非正则表达式位置块似乎是这种情况)。因此,如果您正在执行特定于站点的 PHP 位置以及通用的“全站点”PHP 处理程序(location ~ \.php$
),那么您需要将通用的“全站点”处理程序最后的在服务器块中,否则一切都会变得很糟糕。
是的,这很糟糕,如果我有动力的话,我可能会尝试找出嵌套情况到底出了什么问题(配置解析器没有对其进行处理,所以我怀疑它应该可以工作但实际上没有人使用它,所以它存在缺陷)。
答案3
据我所知,您不能使用嵌套块。
请尝试以下类似操作。
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$
(需要测试)