我有一个位于根目录中的index.php 文件。这会输出 HTML 或 JSON,具体取决于 URL:
<?php
require_once('./../private/Router.php');
new Router();
?>
<html lang=“en”>
...
路由器看起来像这样:
<?php
require_once('Api.php');
class Router
{
public function __construct()
{
$uri = $_SERVER['REQUEST_URI'];
$method = $_SERVER['REQUEST_METHOD'];
if (preg_match('/^\/api\//', $uri)) {
$endpoint = str_replace('/api/', '', $uri);
$api = new Api();
$data = null;
switch ($endpoint) {
case 'players':
$data = $api->getPlayers();
break;
}
if ($data != null) {
$api->sendResponse($data);
} else {
$api->sendResponse(['error' => 'Endpoint not found'], 404);
}
exit;
}
}
}
我的 htaccess 在所有情况下都成功重定向,但输入 /asdasd/asdas 时除外。我的根页面的内容显示,但它抛出一个错误“
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ / [QSA,L]
</IfModule>
测试案例:
<domain>
<domain>/api/players
<domain>/api/players2
<domain>/asd (Possible to remove "asd" after redirect?)
<domain>/asd.php (Possible to remove "asd.php" after redirect?)
<domain>/asd/asd (PROBLEM!)
有趣的是,只有带斜杠的路径才会出现问题。在 .htaccess 中,定义了所有请求都被重定向,这实际上是有效的,但在 index.php 中,Javascript、CSS 等文件的路径定义如下:
./scripts/main.js
./styles/main.css
这种行为很有趣,因为一切都适用于由 .htaccess 转发或直接找到的所有调用,但不适用于其他情况。要解决这个问题,只能删除实现开头的点。
/scripts/main.js
/styles/main.css
根据 URL 中的 slash,假定请求位于 不同的目录 中,这就是文件抛出错误并且语法假定不正确的原因。