Как изменить путь запроса в nginx для PHP / Laravel?

#php #laravel #nginx

#php #laravel #nginx

Вопрос:

Я пытаюсь преобразовать мои устаревшие php-файлы в единую точку входа. На данный момент для работы потребуется несколько конечных точек (10 или около того), например /legacy_endpoint.php . Я хотел бы переписать их в другое действие (post / get и т.д.) На сервере.

Пока я могу переписать конечную точку и пропустить попытку запустить ее как php-файл (поскольку файл не существует):

 
    # rewrite to skip trying to run as PHP file
    # use last to search for a new location, which will hit the rule below
    location ~ ^/legacy_endpoint.php {
       rewrite /(.*) /legacy/endpoint last;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

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


        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
    }
  

Это выполняется и обслуживает index.php досье. Однако в скрипте (Laravel) я все еще вижу «маршрут», запустив dd($request) его как

   requestUri: "/legacy_endpoint.php"
  

Могу ли я как-то переписать это, например /legacy/endpoint , или подобное, непосредственно в nginx? Я предполагаю, что мне придется изменить сам запрос?

Комментарии:

1. Самым чистым решением является внешнее перенаправление, например: location = /legacy_endpoint.php { return 301 /legacy/endpoint; }

2. К сожалению, потребитель устаревших конечных точек не поддерживает перенаправления.

Ответ №1:

index.php скорее всего, получает маршрут из параметра REQUEST_URI, который задается внутри fastcgi_params файла с помощью fastcgi_param REQUEST_URI $request_uri; . Вот почему rewrite...last не будет работать, поскольку $request_uri он никогда не меняется.

Предполагая, что у вас более одного устаревшего URI и что они не существуют как локальные файлы, вы можете использовать map блок для переопределения значения REQUEST_URI для определенных конечных точек. Подробности см. В этом документе.

Например:

 map $request_uri $endpoint {
  default               $request_uri;
  /legacy_endpoint.php  /legacy/endpoint;
}
server {
  ...
  location ~ .php$ {
    try_files $uri /index.php =404;

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $request_filename;
    fastcgi_param REQUEST_URI     $endpoint;

    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
  }
  ...
}
  

map Блок должен выходить за пределы server блока. try_files Оператор добавляется для принудительного ввода URI, заканчивающихся на .php to также find index.php . fastcgi_param Инструкции должны идти после include инструкции, чтобы переопределить значение, установленное во включенном файле.

Если URI /legacy_endpoint.php может содержать необязательную строку запроса, вам нужно будет использовать регулярное выражение для сопоставления с началом URI, например:

 map $request_uri $endpoint {
  default                  $request_uri;
  ~^/legacy_endpoint.php  /legacy/endpoint$is_args$args;
}