Nginx и Laravel: Как ограничить блок "location" с "/" до "/ api"? - PullRequest
1 голос
/ 15 июня 2019

У меня есть приложение Laravel, которое я хотел бы использовать только для его /api маршрутов.При обращении к /, /login, /profile и т. Д. Я бы хотел, чтобы nginx обслуживал индексный файл, расположенный в базовом корне, /var/www/html/index.html.

Вот мой текущий default.conf.Маршруты /api работают, но они также подают / из бэкэнда, чего я не хочу.Если я просто поменяю location / на location /api, маршруты /api станут недоступными, и при попытке получить к ним доступ возвращает индексный файл, расположенный в базовом корне, /var/www/html/index.html.Это противоположно тому, чего я пытаюсь достичь.Ха-ха.

Как я могу сохранить маршруты /api доступными, в то же время не давая серверу обслуживать /?

server {

    listen  80;
    root /var/www/html;
    server_name _;
    index index.php index.html index.htm;

    # API routes should be handled by the backend (Laravel).
    ##### I want to change the following line from "/" to "/api".
    location / {
        root /var/www/backend/public;
        try_files $uri $uri/ /index.php?$query_string;

        location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param SCRIPT_NAME $fastcgi_script_name;
            fastcgi_index index.php;
            include fastcgi_params;
        }

    }

}

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

Я выполнил это, но несколько неуверенно.У меня есть 2 блока местоположения:

  • location ~ "^(?!/api).*$" соответствует всем маршрутам , за исключением тех, которые начинаются с /api.
  • location / соответствует всем другим маршрутам.Причина, по которой он не соответствует всем маршрутам, заключается в том, что nginx сначала сопоставляет блоки местоположения с регулярными выражениями.

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

server {
  listen  80;
  root /var/www/html;
  server_name _;
  index index.php index.html index.htm;

  # All non-API routes should be handled by the frontend.
  # Use a regular expression to identify all requests
  # that do NOT begin with "/api".
  location ~ "^(?!/api).*$" {
    root /var/www/frontend/public;
    try_files $uri $uri/ /index.html =404;
  }

  # API routes should be handled by the backend (Laravel).
  # (Since regex-based location blocks are matched first,
  # this will be a fallback to the above location block).
  location / {
    root /var/www/backend/public;
    try_files $uri $uri/ /index.php?$query_string;

    location ~ \.php$ {
      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      fastcgi_pass unix:/var/run/php-fpm.sock;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param SCRIPT_NAME $fastcgi_script_name;
      fastcgi_index index.php;
      include fastcgi_params;
    }

  }

}
0 голосов
/ 15 июня 2019

Согласно вашей конфигурации, это уже должно происходить.

директива:

try_files $uri $uri/ /index.php?$query_string;

Сначала попытается найти статический файл, и если статический файл существует и не существуетPHP-файл, он будет обслуживаться непосредственно nginx.Только если это php-файл, он будет обслуживаться с помощью php-сервера.

Если вы хотите вообще запретить выполнение файлов .php, вы можете изменить его, чтобы отделить расположение / от /api расположение:

location ~ ^/api/.*\.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    fastcgi_index index.php;
    include fastcgi_params;
}
...