#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;
}