如何在nginx中为PHP/Laravel更改请求路径?

如何在nginx中为PHP/Laravel更改请求路径?,php,laravel,nginx,Php,Laravel,Nginx,我正在尝试将遗留的php文件转换为单个入口点。目前,一些端点需要运行(大约10个),例如/legacy\u endpoint.php。我想在服务器上将这些重写为不同的操作(post/get等) 到目前为止,我可以重写端点并跳过将其作为php文件运行的尝试(因为该文件不存在): 它运行并提供index.php文件。然而,在脚本(Laravel)中,我仍然看到“路由”,通过运行dd($request)将其视为 requestUri: "/legacy_endpoint.php"

我正在尝试将遗留的php文件转换为单个入口点。目前,一些端点需要运行(大约10个),例如
/legacy\u endpoint.php
。我想在服务器上将这些重写为不同的操作(post/get等)

到目前为止,我可以重写端点并跳过将其作为php文件运行的尝试(因为该文件不存在):

它运行并提供index.php文件。然而,在脚本(Laravel)中,我仍然看到“路由”,通过运行
dd($request)
将其视为

  requestUri: "/legacy_endpoint.php"

我是否可以直接在nginx中将其重写为例如
/legacy/endpoint
或类似内容?我猜我必须更改请求本身?

index.php
很可能从参数request\u URI获取路由,该参数使用
fastcgi\u param request\u URI$request\u URI设置在
fastcgi\u params
文件中。这就是为什么
重写…last
无法工作的原因,因为
$request\u 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 $request_uri $endpoint {
  default                  $request_uri;
  ~^/legacy_endpoint\.php  /legacy/endpoint$is_args$args;
}
映射
块必须位于
服务器
块之外。添加了
try\u files
语句,以强制以
.php
结尾的URI也查找
index.php
fastcgi_param
语句必须在
include
语句之后,以覆盖包含文件中设置的值

如果URI
/legacy_endpoint.php
可能包含可选的查询字符串,则需要使用正则表达式来匹配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 $request_uri $endpoint {
  default                  $request_uri;
  ~^/legacy_endpoint\.php  /legacy/endpoint$is_args$args;
}

最干净的解决方案是外部重定向,例如:
location=/legacy_endpoint.php{return 301/legacy/endpoint;}
传统端点的使用者不支持重定向。