Как настроить nginx и fastcgi для запуска Laravel в подпапке?
Я настраиваю несколько приложений Laravel в подпапках одного домена (приложения для социальных сетей, требуется https, один сертификат).
Не могу понять, как написать конфигурацию nginx для сопоставления HTTP-запросов /app1/
к установке Laravel под /var/www/other_folder/public/
Вот последняя итерация тестов конфигурации. Журнал отладки опущен. Корневое местоположение Laravel /app1/ работает, но отображение маршрутов (/app1/api/method/
) не. Помогите, пожалуйста, как отладить, как nginx обрабатывает запрос шаг за шагом (журнал отладки не так уж и понятен), или подскажите, как отобразить подпапки /app1/...
к index.php
Laravel.
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
}
2 ответа
Я думаю, что вы должны изменить корень местоположения. Согласно документации Nginx, корневая директива также имеет контекст "location":
синтаксис: корневой путь;
контекст: 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
}
Насколько я понимаю, директива псевдонима переназначает URL на другой URL, и обработка продолжается, она не определяет каталог, откуда исходные файлы. Я не уверен, что вам все еще нужно переписать в месте PHP.
Этот код не проверен. Но вы говорите, что он работает с /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, с той лишь разницей, что он доступен только для чтения.
Как я уже сказал, это не проверено, но было бы хорошо, если бы это работало. И когда это не так, у меня все еще есть другая идея.