禅道伪静态配置引出的 fastcgi 问题

背景

组里维护开发的系统是基于禅道(ZenTao)框架开发的,生产和测试环境都是搭在 Apache 上,官方文档也是便向于 Apache。最近头脑发热,在本地装了 Docker,配置了 DNMP 环境,想着把禅道跑起来试试,但是一直卡在伪静态和 pathinfo 的配置方面。

最终的解决方案

比较折腾的解题思路就不放出来了,直接放个参考答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 80;
server_name domain;
root /var/www/html/site/www;
index index.php index.html index.htm;

access_log /dev/null;
error_log /var/log/dnmp/nginx.site.error.log warn;

location / {
try_files $uri /index.php$uri?$query_string;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}

fastcgi.conf vs fastcgi_params

Nginx 安装之后会有两个 FastCGI 配置文件,一个是 fastcgi.conf,一个是 fastcgi_params。对比这两个文件,其实只有一点点的差异,fastcgi.conf 多了以下一行内容。

1
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

原本 Nginx 只有 fastcgi_params,后来发现很多人在定义 SCRIPT_FILENAME 时使用了硬编码的方式,如下。为了规范用法便引入了 fastcgi.conf。

1
fastcgi_param SCRIPT_FILENAME /var/www/foo$fastcgi_script_name

目前,也比较推荐大家使用 fastcgi.conf 而不是 fastcgi_params。