Как получить маршруты Slim PHP Framework в подкаталоге на nginx

Я пытаюсь переместить приложение Slim в подкаталог, чтобы к нему можно было получить доступ по адресу example.com/api/, но у меня серьезные проблемы с получением маршрутизации на работу.

Основной скрипт находится на /website/workbench/api/public/index.phpтак что вызов example.com/api/project/1 должен ударить папку API. Тем не менее, мне также нужно иметь доступ к example.com index.html файл (который работает на Angular JS).

Когда я иду в example.com/api/project/1 — Я могу var_dump переменные и увидеть их. Однако маршрутизация не вступает в силу, и переменные запроса кажутся пустыми.

/ И т.д. / Nginx / сайты Недоступные / верстак

server {
listen   80; ## listen for ipv4; this line is default and implied

root /website/workbench;
index index.php index.html index.htm;

server_name example.com;

location / {
try_files $uri $uri/ index.php?$query_string;
}

location /api/ {
try_files $uri $uri/ /api/public/index.php?$query_string;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param PHP_VALUE "newrelic.appname=workbench";
include fastcgi_params;
}

location ~ /\.ht {
deny all;
}
}

(Очевидно, example.com заменяется реальным доменным именем)

Частичный вывод var_dump($_SERVER);

array(34) {
["USER"]=>
string(8) "www-data"["HOME"]=>
string(8) "/var/www"["FCGI_ROLE"]=>
string(9) "RESPONDER"["PHP_VALUE"]=>
string(26) "newrelic.appname=workbench"["QUERY_STRING"]=>
string(0) ""["REQUEST_METHOD"]=>
string(3) "GET"["CONTENT_TYPE"]=>
string(0) ""["CONTENT_LENGTH"]=>
string(0) ""["SCRIPT_FILENAME"]=>
string(39) "/website/workbench/api/public/index.php"["SCRIPT_NAME"]=>
string(21) "/api/public/index.php"["REQUEST_URI"]=>
string(15) "/api/projects/1"["DOCUMENT_URI"]=>
string(21) "/api/public/index.php"["DOCUMENT_ROOT"]=>
string(18) "/website/workbench"["SERVER_PROTOCOL"]=>
string(8) "HTTP/1.1"["GATEWAY_INTERFACE"]=>
string(7) "CGI/1.1"["SERVER_SOFTWARE"]=>
string(11) "nginx/1.4.6"}

var_dump($_REQUEST) дает пустой массив.

Ясно, что с моей настройкой что-то поразительно не так, но я изо всех сил пытаюсь понять, что! изменения $query_string в $args также не имеет никакого эффекта.

1

Решение

Я думаю, что вы можете удалить $query_string от try_files, Добавить root директива в /api местоположение, как это:

location /api {
root /website/workbench/api;
try_files $uri $uri/ /public/index.php;
}

и использовать fastcgi_param SCRIPT_FILENAME параметр в конечном итоге определяется как:

 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

в fastcgi_params файл.

4

Другие решения

Здесь очень поздно для вечеринки, но у меня возникла та же проблема с обслуживанием статических файлов (приложение Angular) в корне сайта и обслуживанием тонкого приложения в / api. Как вы указали, Слим действительно нуждается в REQUEST_URI в не иметь /api в этом.

server {
server_name example.com;

location ~ ^/api/(.*)$ {
alias /path/to/slim-app/public/;
try_files $1 $1/ @php;
index index.php;
}

location / {
root /path/to/your/static/files;
}

location @php {
fastcgi_split_path_info ^(/api)(/.*)$;
fastcgi_pass localhost:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /path/to/slim-app/public/index.php;
fastcgi_param REQUEST_URI $fastcgi_path_info;
fastcgi_read_timeout 900;
}
}

Ключ для меня лгал в fastcgi_split_path_info обман. Согласно http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info, то, что делает операция, разделяет $fastcgi_path_info переменная на две новый переменные называются $fastcgi_script_name а также $fastcgi_path_info,

Когда вы положили в fastcgi_split_path_info ^(/api)(/.*)$; вы по сути настроены $fastcgi_script_name в /api и установить $fastcgi_path_info в /my/route, Я обнаружил, что этого было достаточно, чтобы Slim (v3) работал так, как я хотел.

Тем не менее, я также обнаружил, что мое приложение Slim по умолчанию имеет DOCUMENT_URL а также SCRIPT_NAME переменные установлены в index.php, Таким образом, вы также можете установить их (хотя это не так казаться быть обязательным):

set $script_name "/index.php";
fastcgi_param DOCUMENT_URI $script_name;
fastcgi_param SCRIPT_NAME $script_name;
7

По вопросам рекламы [email protected]