Я пытаюсь переместить приложение 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
переменные и увидеть их. Однако маршрутизация не вступает в силу, и переменные запроса кажутся пустыми.
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
также не имеет никакого эффекта.
Я думаю, что вы можете удалить $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
файл.
Здесь очень поздно для вечеринки, но у меня возникла та же проблема с обслуживанием статических файлов (приложение 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;