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');
我有一个 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');