PHP Slim 4 HttpNotFoundException -- 将应用程序移动到实时服务器时找不到路由

PHP Slim 4 HttpNotFoundException -- Routes not found when moving application to live server

我有一个 WordPress 网站,我用 Slim Framework 扩展了它以提供一些自定义 API。在本地一切正常,但是当我在实时服务器 (SiteGround) 上移动应用程序时,如果我尝试调用任何自定义端点,我会得到 404 error Slim\Exception\HttpNotFoundExceptio.

这是我的文件夹结构

在本地 root 文件夹是 C:\xampp\htdocs\example\

远程 root 文件夹是 /home/customer/www/example.com/public_html/

api\
  vendor\
  public\
    .htaccess
    index.php
  routes\
    v1\
      autocomplete.php
  .htaccess
  composer.json
  composer.lock
wp-admin
wp-content
wp-includes
... all others WordPress files

在本地,我可以调用端点 http://localhost/example/api/v1/autocomplete,而在远程,如果我调用 https://www.example.com/api/v1/autocomplete,我会得到一个 404 not found error

code: 404
file: "/home/customer/www/example.com/public_html/api/vendor/slim/slim/Slim/Middleware/RoutingMiddleware.php"
line: 91
message: "Not found."
type: "Slim\Exception\HttpNotFoundException"

根据 Slim documentation the Apache mod_rewrite is enabled by the default WordPress .htaccess and AllowOverride All is setted by default on all SiteGround server.

这里是重要的 Slim 文件内容

root\api\.htaccess

RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/ [L]

root\api\public\.htaccess

# Redirect to front controller
RewriteEngine On
# RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L] 

root\api\public\index.php

<?php
use Selective\BasePath\BasePathMiddleware;
use Slim\Factory\AppFactory;

require_once __DIR__ . "/../vendor/autoload.php";

$app = AppFactory::create();

// Add Slim routing middleware
$app->addRoutingMiddleware();

// Set the base path to run the app in a subdirectory.
// This path is used in urlFor().
$app->add(new BasePathMiddleware($app));

$app->addErrorMiddleware(true, true, true);
 
// PUT ALL ROUTES HERE
require_once "../routes/v1/autocomplete.php";

// Run app
$app->run();

root\api\routes\v1\autocomplete.php

<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;

$app->get("/v1/autocomplete", function (Request $request, Response $response) {
  $params = $request->getQueryParams();
  $payload = array(
    "status" => "error",
    "message" => "missing param 'user_input'",
  );
  if (isset($params["user_input"])) {
    $payload = getSuggestions($params);
  }
  $response->getBody()->write(json_encode($payload));
  return $response
    ->withHeader("Content-Type", "application/json");
});

提前致谢

如果您 运行 您的 Slim 4 应用位于网络服务器 DocumentRoot 的子目录中,则需要设置 basePath。

也许在你的情况下:

$app->setBasePath('/api');