Оказывается, что в nginx большая часть повторения не нужна.
Директивы использовать fastcgi для .php
и скрывать /.ht
файлы уже были регулярными выражениями, поэтому они влияют на все.Достаточно указать index
один раз, и по умолчанию там было избыточно, если я хочу использовать только index.php
.
Поскольку все приложения вложены в файловую систему так же, как в Интернете, указав rootтоже не было необходимости.
Меня удивило то, что location ^~ /(system|data)/ { ... }
соответствует не только www.example.com/system/
, но и www.example.com/sub1/system/
.Я думал, что ^~
должно совпадать только в том случае, если начало местоположения соответствует регулярному выражению ...
# [non-www and http redirects]
server {
# [listen directives]
server_name www.example.com;
root /srv/app;
index index.php;
location ^~ /(system|data)/ {
return 403;
}
# Use PHP
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
# Pass non-file URI to index.php for all locations
location /sub1/ {
try_files $uri $uri/ /sub1/index.php?$query_string;
}
location /sub2/ {
try_files $uri $uri/ /sub2/index.php?$query_string;
}
# [other sub-apps included in the same way]
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ /\.ht {
deny all;
}
# [ssl stuff]
}
Я также пытался заменить отдельные местоположения на
location ^~ /(sub1|sub2)/ {
try_files $uri $uri/ /$1/index.php?$query_string;
}`
, но не смогпреуспеть с этим - это местоположение почему-то никогда не совпадало, и все вместо этого было передано /index.php
в базе.