Как настроить nginx и fastcgi для запуска Laravel в подпапке?

Как настроить nginx и fastcgi для запуска Laravel в подпапке?

Я настраиваю несколько приложений Laravel в подпапках одного домена (приложения социальных сетей, требуется https, один сертификат).

Не могу понять, как написать конфигурацию nginx для сопоставления HTTP-запросов /app1/с установкой Laravel в/var/www/other_folder/public/

Вот последняя итерация тестов конфигурации. Отладочное журналирование пропущено. Корневое расположение Laravel /app1/ работает, но отображение маршрутов ( /app1/api/method/) — нет. Пожалуйста, помогите, как отладить, как nginx обрабатывает запрос пошагово (отладочный журнал не так уж и поясняет), или дайте мне подсказку, как отобразить подпапки в /app1/...Laravel index.php.

server {
    listen      80;
    server_name  apps.mydomain.com;
    root    /var/www/apps.mydomain.com/docs;

    location /  {
        index   index.html index.php;
    }

    location /app1    {
        alias   /var/www/other_folder/public;
        index   index.php   index.html;
        try_files   $uri  $uri/ /app1/index.php$is_args$args /app1/index.php?$query_string;
    }

    location ~ /app1/.+\.php$ {
        rewrite ^/app1/(.*)$  /$1  break;
        include /etc/nginx/fastcgi.conf;
        fastcgi_param    SCRIPT_FILENAME    /var/www/other_folder/public$fastcgi_script_name;

        fastcgi_index  index.php;
        fastcgi_pass php;

        #   Database access parameters
        fastcgi_param   DB_HOST "localhost";
        fastcgi_param   DB_USER "apps";
        fastcgi_param   DB_PASS "xxxxxxxx";
        fastcgi_param   DB_NAME "app1";
    }

    # Other locations skipped
    include /etc/nginx/global/php.conf; # other php scripts
}

решение1

Я думаю, вам следует изменить корень расположения. Согласно документации Nginx, директива root также имеет контекст "расположение":

синтаксис: корневой путь;

контекст: http, сервер, местоположение, если в местоположении

Итак, вы должны быть в состоянии сделать что-то вроде следующего:

server {
    listen      80;
    server_name  apps.mydomain.com;
    root    /var/www/apps.mydomain.com/docs;

    location /  {
        index   index.html index.php;
    }

    location /app1    {
        root   /var/www/other_folder/public;
        rewrite ^/app1/(.*)$  /$1  break;
        index   index.php   index.html;
        try_files   $uri  $uri/ /index.php$is_args$args /index.php?$query_string;
    }

    location ~ /app1/.+\.php$ {
        root   /var/www/other_folder/public;
        rewrite ^/app1/(.*)$  /$1  break;
        include /etc/nginx/fastcgi.conf;
        fastcgi_param    SCRIPT_FILENAME    $document_root$fastcgi_script_name;

        fastcgi_index  index.php;
        fastcgi_pass php;

        #   Database access parameters
        fastcgi_param   DB_HOST "localhost";
        fastcgi_param   DB_USER "apps";
        fastcgi_param   DB_PASS "xxxxxxxx";
        fastcgi_param   DB_NAME "app1";
    }

    # Other locations skipped
    include /etc/nginx/global/php.conf; # other php scripts
}

Насколько я понимаю, директива alias переназначает URL на другой URL и обработка продолжается, она не определяет каталог, откуда исходные файлы. Я не уверен, нужно ли вам все еще переписывать в расположении PHP.

решение2

Этот код не проверен. Но вы говорите, что он работает с /app1/, но не с /app1/api/method/. Я предполагаю, что ваша проблема кроется в этой части:

location /app1    {
    alias   /var/www/other_folder/public;
    index   index.php   index.html;
    try_files   $uri  $uri/ /app1/index.php$is_args$args /app1/index.php?$query_string;
}

так что это по сути говорит нам попробовать url, и если он не соответствует, попытаться сопоставить его как каталог url/, и если файлов и каталога не существует, то мы пытаемся сопоставить его как /app1/index.php?someargs, и если он не существует, сопоставить его как/app1/index.php?$query_string

Прежде всего,псевдоним и try_filesне работают вместе, поэтому вы можете использовать root вместо этого. Измените блок расположения /app1 на следующий, чтобы посмотреть, решит ли это вашу проблему.

location /app1    {
    root   /var/www/other_folder/public;
    index   index.php   index.html;
    try_files $uri $uri/ /index.php$is_args$args;
}

Во-вторых, $query_string — это то же самое, что и $args, единственное отличие в том, что этотолько для чтения.

Как я уже сказал, это не проверено, но было бы здорово, если бы это сработало. А если не сработает, у меня все равно есть еще одна идея.

Связанный контент