我在 1 docroot 下有一些 php 应用程序,如下所示:
/data/app/
|-- antispam.php
|-- api
| `-- functions.php
|-- images
|-- messaging
|-- parents
| `-- index.php
`-- students
`-- index.php
我想从上述目录创建一些 vhost,使得 docroot 变成:
/data/app/parents : parents.example.com
/data/app/students : students.example.com
这些 vhost 将需要访问 /data/app 中的一些共享函数(antispam.php、api/functions.php、messaging/ 和 images/)
来自我的 nginx 配置的一些片段:parents.example.com
server {
listen 80;
server_name parents.example.com;
root /data/app/parents;
index index.php ;
access_log /var/log/nginx/example.com.log combined;
location ~ ^/api { root /data/app/; }
location ~ ^/images { root /data/app/; }
location ~ ^/antispam.php { alias /data/app/antispam.php ;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
}
只要我定义了位置,并且 docroot (/data/app) 有一个有效目录,上述配置就可以正常工作。问题是,如果我在 /data/app 中有 100 个目录(包含 PHP 脚本),这些目录是 vhost 所需的,我是否应该在 Nginx 服务器块中定义每个目录?我想知道,如果在位置块中没有定义,它会先在 /data/app/ 中搜索,然后再提交 404,可能类似于 try_files。
答案1
我建议您在文件系统上使用符号链接,这样/data/app/parents/antispam.php
就是指向的符号链接../antispam.php
。您可以对子目录执行相同的操作。
答案2
您可以在 server_name 指令中使用变量,然后在其他指令(包括 root 指令)中重复使用它们。
因此您应该能够使用单个块定义无限的子域,如下所示:
server {
listen 80;
server_name ~(?<subdomain>^.*?)\.?example\.com;
root /data/app/$subdomain;
index index.php;
access_log /var/log/nginx/$subdomain.example.com.log combined;
location /api/ {
root /data/app;
}
location /images/ {
root /data/app;
}
location ~ \/antispam.php$ {
alias /data/app/antispam.php ;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
}