Я немного почитал и не могу найти ответа на свой вопрос, так как в нем есть один ключевой компонент, который отличается от большинства случаев. Все начинается так же, как и любая другая история: мне нужно перенести .htaccess в конфигурацию nginx, что было бы довольно просто, если бы не это: сервер nginx настроен для использования динамических хостов:
server {
listen 80;
server_name ~^(www\.)?(?<sname>.+?).server.company.com$;
root /var/www/$sname/current/public;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~* \.(gif|png|bmp|ico|flv|swf|exe|html|htm|txt|css|js) {
add_header Cache-Control public;
add_header Cache-Control must-revalidate;
expires 7d;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
}
location ~ /\.ht {
deny all;
}
}
Это делается для запуска нескольких проектов на одном поддомене в зависимости от их каталога. Проблема в том, что один из этих проектов (назовем его theproject.domain.company.com) - очень старый гигант, который использует .htaccess для множества перенаправлений. Я могу создать блоки местоположения для этих перенаправлений, но я не знаю, как применить их только к этому проекту (я не очень разбираюсь в nginx).
Я готов принять любое возможное решение, и я предполагал следующее:
1) конфигурация nginx для конкретного каталога - вроде как htaccess, но не уверен, что nginx вообще способен загружать конфигурацию на лету
2) использование блока if для определенного имени сервера, но не уверен в синтаксисе, так как я не смог найти никаких примеров использования if для имени сервера
3) отдельный виртуальный хост для этого поддомена, это было бы жизнеспособным, хотя и не очень изящным решением для моей проблемы, проблема в том, что я не знаю, как установить приоритеты, поскольку этот поддомен будет соответствовать тому же шаблону динамического виртуального хоста
Любая помощь, совет или ссылки очень приветствуются
Вариант (3) снижает риск взлома каждого субдомена только для исправления одного мошеннического субдомена. А server
блок с server_name
то есть точное совпадение всегда будет иметь приоритет над регулярным выражением server_name
. Видеть этот документ для подробностей.
Если вы хотите свести к минимуму дублирование конфигурации, выгрузите общие операторы в отдельный файл и вставьте их, используя include
заявление.
Например:
server {
listen 80;
server_name www.theproject.server.company.com theproject.server.company.com;
root /var/www/theproject/current/public;
#
# ... statements to fix "theproject"
#
include /path/to/common/config;
}
server {
listen 80;
server_name ~^(www\.)?(?<sname>.+?).server.company.com$;
root /var/www/$sname/current/public;
include /path/to/common/config;
}