如何解决PHP Slim 4 HttpNotFoundException -- 将应用程序移动到实时服务器时找不到路由
我有一个 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 All
为 setted 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");
});
提前致谢
解决方法
如果您在 Web 服务器 DocumentRoot 的子目录中运行 Slim 4 应用程序,则需要设置 basePath。
也许在你的情况下:
x1=-22.5;
x2=-37.5;
y1=0;
y2=15;
x = [x1,x2,x1,x1];
y = [y1,y1,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,binay];
plot(x,y,'r','LineWidth',3);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。