Я пытаюсь выполнить два веб-сайта на том же имени хоста, где каждый служит статическому содержанию (приложение AngularJS), и другой направляет все запросы к PHP (API записанное использование Apigility), но только для определенного пути в URL (больше на этом позже).
В данный момент у меня есть два nginx vhosts слушающий на двух различных доменах, который работает просто великолепно, однако клиентское приложение будет в конечном счете проходить проверку подлинности против API с помощью OAuth, и я не хочу хранить маркеры или любые другие уязвимые данные в cookie клиента, локальном устройстве хранения данных или где-либо еще. Эта статья объясняет обоснование позади него лучше, чем я мог объясниться.
С той проблемой в памяти я решил иметь сервер "прокси", который будет (важной) подачей по умолчанию любое статическое содержание, которое клиентский браузер запрашивает, однако если запрос прибывает в это, запускается с /api/
затем это должно быть перенаправлено к php-fpm.
Чтобы дать Вам пример, давайте предположим, что API имеет конечную точку /users
. То, что я хочу смочь сделать, запущено мое приложение AngularJS, как я обычно был бы, например, на http://monkey.com/index.html
но в то же время если я выполняю запрос Ajax к http://monkey.com/api/users
это должно передать /users
бит к PHP, который будет установлен в другом каталоге (ради этого вопроса предполагают, что приложение AngularJS установлено в /var/www/website
и API находится в /var/www/api
.
Это две конфигурации, которые я имею в данный момент и которые работают отдельными веб-сайтами:
Конфигурация приложения AngularJS:
server {
listen 80;
server_name monkey.com;
root /var/www/website;
index index.html
location / {
try_files $uri $uri/ /index.html =404;
}
}
Конфигурация API:
server {
listen 80;
server_name api.monkey.com;
root /var/www/api/public;
index index.php
include /etc/nginx/fcgiwrap.conf;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
include fastcgi_params;
}
}
Для предотвращения беспорядка, я не отправлю свои неудачные попытки, но я могу только сказать, что попытался использовать root
и alias
напрасно. Я предполагаю, что моя самая большая проблема, я не уверен, как извлечь только часть, которая прибывает после /api
и передайте его PHP, который, более того, находится в другом каталоге к $document_root.
Я видел довольно много статей и ответов на НАСТОЛЬКО упоминающем это наличие root
внутри a location
запись не является хорошей идеей, но я не думаю, что это может быть решено, не делая ее.
Я боролся с этой на вид простой проблемой некоторое время теперь, таким образом, я надеюсь, что кто-то может дать пример конфигурации, которая на самом деле работает.
После того, как я потратил значительное количество времени, пытаясь получить рабочую конфигурацию, я, кажется, наконец-то сумел это сделать.
Теперь я могу выполнять запросы на http://monkey.com/some/angular/path
или http://monkey. com/api/users
и обслуживать оба, статический контент или PHP-сайт, соответственно, из одного и того же домена.
В случае, если кто-то наткнется на этот вопрос, вот конфигурация, которую я закончил с:
server {
listen 80;
server_name monkey.com;
location / {
alias /var/www/website/;
try_files $uri $uri/ /index.html =404;
}
location /api/ {
alias /var/www/api/public;
try_files /index.php =404;
set $path $request_uri;
if ($request_uri ~ ^/api/(.*)$ ) {
set $path /$1;
}
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param REQUEST_URI $path;
}
}
Конфигурация выше убирает префикс /api/
и устанавливает REQUEST_URI
на все, что за ним последовало. Например, если вы запросили monkey.com/api/users/1
вы бы в конечном итоге передали /users/1
на php-fpm.
Если вам не нужно изменить оригинальный URI запроса в любом случае и просто хотите передать весь URI запроса в PHP вы можете упростить (и, возможно, ускорить) конфигурацию следующим образом:
server {
listen 80;
server_name monkey.com;
location / {
alias /var/www/website/;
try_files $uri $uri/ /index.html =404;
}
location /api/ {
alias /var/www/api/public;
try_files /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
}
Теперь на настройку проекта Guzzle для прокси-сайта!
.Первым делом:
Этот код был бы невозможен без 'Andris', Google и других.
Пожалуйста, сначала прочтите его код, а затем прочтите его, если это вам не удастся!
.
Угловой или любой другой сервис может обслуживаться на порту 4200 и на пути по умолчанию /
Например: http://example.com/ будет работать под углом.
Любой запрос типа http://example.com/api/index.php будет перенаправлен на соответствующий маршрут, удаляя '/api' из него. Поэтому http://example.com/api/index.php будет считаться http://example.com/index.php
Я только что проверил этот код, пожалуйста, ответьте вашим патчем и предложениями, если они есть!
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name localhost;
#root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://127.0.0.1:4200;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /api/ {
root /var/www/api/public;
try_files /index.php =404;
set $path $request_uri;
if ($request_uri ~ ^/api/(.*)$ ) {
set $path /$1;
}
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$path;
fastcgi_param REQUEST_URI $path;
# index index.php index.html index.htm;
}
}