F3 路由引擎在 Linux 上使用 XAMPP 和 PhpStorm 工作,但为 CSS 文件提供 404

问题描述

我正在尝试在 Linux 上使用 PHPStorm 和 XAMPP 编写 F3(“Fat Free Framework”)应用程序。

为了使用 RewriteEngine 所必需的 F3 提供的 .htaccess 文件(请参阅注释以了解为什么这是错误的),我使用以下特殊运行配置启动我的代码

Edit run/debug configurations menu from PhpStorm

我启动了运行配置,它启动了 Web 服务器。我打开浏览器并转到 http://localhost:8000/ 。我可以看到内容链接有效,我可以根据定义的路线从一个页面导航到另一个页面

但是没有任何 CSS 存在。如果我单击“查看源代码”并单击 CSS 链接,我会从 F3 收到 404 Not Found 消息。因此,似乎出于某种原因,F3 阻止了 CSS 文件

网页开头如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <title>A title</title>
    <link href="{{@BASE}}/f3style.css" rel="stylesheet" type="text/css" />
</head>

尽管在我的例子中 @BASE 变量是空的。 “f3style.css”文件目前确实在我的网络目录的根目录下。

我使用 F3 推荐的认 .htaccess 文件

RewriteEngine On

# Uncommenting the following line has no effect
# RewriteBase /

RewriteRule ^(app|tmp)\/|\.ini$ - [R=404]

RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.PHP [L,QSA]
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
罢工>

(同样,请参阅有关为什么 .htaccess 文件与此处无关的评论

这是我的路线。它们在“index.PHP”中:

<?PHP

$f3 = require('lib/base.PHP');

// Routes
require 'controller.PHP';
$f3->route('GET /index.PHP','Controller->showMain');
$f3->route('GET /','Controller->showMain' );
$f3->route('GET /items/@item','Controller->showItem');

$f3->run();

知道我应该寻找什么吗?

解决方法

根据您使用的屏幕截图 PHP's built-in web server。问题是:它不支持.htaccess。因此,所有 HTTP 请求都转到您的路由器脚本(framework/index.php - 我猜是 F3 应用程序的一部分)。

我不熟悉 F3 路由的工作原理,但我认为它与其他路由相同:它经过所有注册的路由/端点,如果没有找到匹配项,它将报告“404 Not Found”响应。

由于没有来自 .htaccess 的规则来过滤对此类静态/现有文件(css/jpg/png/js 等)的请求,因此请求通过您的 index.php,通过整个路由表中的 F3 会向浏览器报告 404 错误(当未找到匹配的路由时)。

这里有几个可能的解决方案:

  1. 为此类静态资源创建一个单独的路由,并从您的 F3 代码中为它们提供服务(您的代码需要定位文件并发送带有正确标头的响应等)

    TBH 不值得以这种方式实现它(因为它只是为了处理这种特定情况/在 PHP 的 Web 服务器下)。

  2. 进行预过滤并忽略对此类静态文件的任何请求。使用 PHP 的 Web 服务器时,需要在路由器脚本中返回 false(它告诉 PHP 使用内置的 Web 服务器代码来处理此类请求)。查看以下链接中的示例并将类似的示例添加到您的代码中:https://www.php.net/manual/en/features.commandline.webserver.php#example-426

    if (preg_match('/\.(?:png|jpg|jpeg|gif|css)$/',$_SERVER["REQUEST_URI"])) return false;
    

    注意:您可以像您一样将其直接添加到现有的 index.php 中(在顶部,在所有 use 行之后,但在实际代码行之前)但这意味着您正在硬编码这样的特定 - to-PHP's-web-server-only 逻辑到可以在适当的 web 服务器下运行的脚本。
    相反我建议创建一个单独的路由器脚本(例如 php-router.php 并使用它代替屏幕截图中的 index.php),您将在其中执行此操作,并且如果执行将通过该条件,则仅然后从您的真实 index.php(即 require './index.php'; 或类似)调用代码


为什么不首先使用 XAMPP 中的 Apache Web 服务器来为整个站点提供服务?

  • 一旦 Apache 运行,它就会处理所有虚拟主机(您可以通过操作系统 hosts 文件中的虚假域名或通过在自定义专用端口上拥有网站来访问这些主机)——无需启动每个虚拟主机网站分开。
  • Apache 显然完全支持 .htaccess,并且总是比仅用于开发的 PHP 内置网络服务器(mod_rewrite 和其他模块)更好/更多功能/更接近生产环境。