У меня есть два приложения: интерфейс HTML + JS и бэкэнд PHP. Я хотел бы настроить Nginx так, чтобы оба они обслуживались из одного домена. Запросы к бэкэнду выполняются с использованием URL-адресов, начинающихся с /api
.
Моя попытка была такой:
server {
root /path/to/frontend;
index index.html;
server_name example.com;
location / {
try_files $uri $uri/ /index.html;
}
location /api {
alias /path/to/backend;
index index.php;
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}
Однако для всех запросов к бэкэнду я получаю 404: основной сценарий неизвестен.
Есть ли способ достичь того, что я пытаюсь сделать здесь? Как?
Вы совершили обычную ошибку, когда люди не понимали, как работает nginx. Помните следующее:
nginx всегда обслуживает запрос с не замужем location
только блок.
Я предлагаю вам (пере) прочитать следующее: Как nginx обрабатывает запрос
Теперь, глядя на вашу конфигурацию, серверные запросы должны обслуживаться двумя местоположениями:
location /api
location ~\.php$
Следующий location
документации, первая из них называется префикс место, а второй - регулярное выражение (регулярное выражение) один. nginx проверит оба, но в конечном итоге выберет только один, который в вашем случае является регулярным выражением.
Теперь при его обработке nginx перенаправит запрос на /path/to/frontend/<yourFile>.php
в PHP, построив путь из root /path/to/frontend
, так как это единственный определенный. Затем бэкэнд не может найти указанный файл.
Вы можете попробовать следующее:
location /api {
alias /path/to/backend;
index index.php;
try_files $uri $uri/ /index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
# Useless? Request always ending up with '.php' here...
fastcgi_index index.php;
include fastcgi_params;
# Try to secure this block, which might lead to arbitrary code execution.
}
}
Что касается отсутствия безопасности, я провел доклад о nginx и PHP-FPM на nginx.conf 2014 в конце октября. Слайды доступны: https://rosset.net/LAMP_just_died.pptx. Видео скоро будет доступно.