Nginx отдельные приложения в подкаталогах - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь переместить приложение с сервера apache на nginx.Проблема в том, что в подкаталогах есть несколько приложений, и я не могу найти правильный способ настройки сервера.

Что мне нужно:

  • www.example.com обслуживает от /srv/app
  • www.example.com/sub1 обслуживает с /srv/app/sub1
  • www.example.com/sub2 обслуживает с /srv/app/sub2

Каждое из приложений нуждается в одинаковой конфигурации, поэтому я извлекчто во фрагменте:

# snippets/app.conf

index index.php index.html index.htm index.nginx-debian.html;

location /system {
    return 403;
}

# [a couple of other 403s excluded]

# Pass non-file URI to index.php
location / {
    try_files $uri $uri/ /index.php?$query_string;
}

# Use PHP
location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}

# Hide .htaccess
location ~ /\.ht {
    deny all;
}

И в файле основного сервера:

# [non-www and http redirects]

server {
    # [listen directives]

    server_name www.example.com;

    root /srv/app;

    include snippets/app.conf;

    location /sub1 {
        root /srv/app/sub1;
        include snippets/app.conf;
    }

    # [other sub-apps included in the same way]

    # [ssl stuff]
}

Однако, это дает мне ошибку:

nginx: [emerg] location "/ system" находится вне местоположения "/ sub1" в /etc/nginx/snippets/app.conf:5

Из ошибки видно, что /system интерпретируется как "Абсолютный www.example.com/system вместо вложенного www.example.com/sub1/system.Можно ли как-то указать, что я хочу, чтобы вложенные расположения считались относительными?Или мне просто нужно повторить почти одинаковую конфигурацию для каждого под-приложения, меняя префиксы?

1 Ответ

0 голосов
/ 16 апреля 2019

Оказывается, что в 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 в базе.

...