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

时间:2020-12-20 10:16:56

标签: php slim

我有一个 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,Apache mod_rewrite 由默认 WordPress .htaccess 启用,AllowOverride Allsetted by default on all SiteGround server

这里是重要的 Slim 文件的内容

root\api\.htaccess

RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [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");
});

提前致谢

1 个答案:

答案 0 :(得分:0)

如果您在 Web 服务器 DocumentRoot 的子目录中运行 Slim 4 应用程序,则需要设置 basePath。

也许在你的情况下:

x1=-22.5;
x2=-37.5;
y1=0;
y2=15;
x = [x1, x2, x2, x1, x1];
y = [y1, y1, y2, y2, y1];
xC= -30;
yC = 30;
xR = 30;
yR = 15;
theta = 0 : 0.01 : 2*pi;
binax = xR * cos(theta) + xC;
binay = yR * sin(theta) + yC;
x = [x, NaN, binax];
y = [y, NaN, binay];
plot(x, y, 'r', 'LineWidth', 3);
相关问题