
У меня есть несколько PHP-приложений в 1 docroot, как показано ниже:
/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) имеет допустимый каталог. Проблема в том, что если у меня есть 100 каталогов (содержащих PHP-скрипт) в /data/app, которые требуются vhost, должен ли я определять каждый из них в блоке сервера Nginx? Мне было интересно, что если ни один из них не определен в блоке местоположения, он сначала будет искать в /data/app/ перед фиксацией 404, что-то вроде try_files, возможно.
решение1
Я предлагаю вам использовать символические ссылки в файловой системе, чтобы это /data/app/parents/antispam.php
была символическая ссылка, указывающая на ../antispam.php
. Вы можете сделать то же самое с подкаталогами.
решение2
Вы можете использовать переменные в директиве server_name, а затем повторно использовать их в других директивах, включая корневую директиву.
Таким образом, вы сможете определить бесконечное количество поддоменов, используя один блок, например так:
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;
}
}