Конфигурация NGINX для PHP-бэкэнда и JS-интерфейса - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь обслуживать мое приложение в /, но запросы / oauth2 передаются в бэкэнд php.Вот моя последняя попытка конфигурирования nginx:

upstream dockerphp {
    server backendphp:9000;
}

server {
    listen       80;
    server_name  localhost;
    index index.html;
    root   /application/frontend/build;

    location /oauth2 {
        root   /application/public;
        index index.php;
        try_files $uri $uri/ /index.php$is_args$args;
        #try_files /index.php$is_args$args =404;

        location ~ \.php$ {
            include /etc/nginx/fastcgi_params;

            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_pass  dockerphp;
            fastcgi_index index.php;
        }
    }

    location / {
        try_files $uri $uri/ /index.html;
    }
}

Я пробовал практически все комбинации конфигураций, которые только могу придумать, и просто не могу заставить их работать.Большую часть времени я получаю 404 с.

В моих контейнерах nginx и php монтируется один и тот же каталог / application.

При использовании вышеуказанного конфига любые запросы к / oauth2 / blah выполняютсябыть поднятым блоком местоположения внизу и, следовательно, вернуться к моему интерфейсу.Вероятно, это самая большая моя проблема - блок локации / oauth2, на мой взгляд, более «специфичен», так почему он не «выигрывает»?

Вместо этого я попробовал закомментированную строку try_files (чтобы узнать, есть ли индекс.php, являющийся «резервным» значением, оказал влияние на специфичность), и nginx просто начал загружать файл index.php, а не передавать запрос.Помощь

Ответы [ 3 ]

1 голос
/ 28 апреля 2019

Я использую этот подход:

  1. попытка подать js / статические страницы первыми
  2. если 1.) не удается, перейдите к бэкэнду PHP
  3. определить местоположение для обработки .php
    upstream dockerphp {
        server backendphp:9000;
    }


    server {
        listen           80;
        server_name      localhost;
        index            index.html;
        root             /application/frontend/build;

        location / {
            try_files    $uri $uri/ @php;
        }

        location @php {
            root         /application/public;
            index        index.php;
            try_files    $uri $document_root/index.php?$query_string; 
            # $document_root/index.php is the important part due to how root and alias directives work
        }

        location ~ \.php$ {
            include      /etc/nginx/fastcgi_params;

            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_pass  dockerphp;
            fastcgi_index index.php;
        }
    }
0 голосов
/ 28 апреля 2019

Для справки я в итоге нашел простое рабочее решение (ниже).

upstream dockerphp {
    server backendphp:9000;
}

server {
    listen       80;
    server_name  localhost;
    index        index.html;
    root         /application/frontend/build;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /oauth2 {
        try_files $uri $uri/ @php;
    }

    location @php {
        include                  /etc/nginx/fastcgi_params;
        fastcgi_pass             dockerphp;
        fastcgi_param            SCRIPT_FILENAME /application/public/index.php;
    }
}
0 голосов
/ 28 апреля 2019

location /oauth2 выигрывает только тогда, когда вы пытаетесь указать URL website.com/oauth2.Добавьте ^~, и маршрут получит все URL, начинающиеся с /oauth2, например:

location ^~ /oauth2 {
...