Slim PHP Framework 3.0:访问.phtml模板路由时出现404错误

时间:2018-11-24 08:45:32

标签: php api routing http-status-code-404 slim

服务器配置:

  • Ubuntu 18.04
  • Apache 2.4.29
  • PostgreSQL 10.6
  • PHP 7.3(我使用的是7.2,但系统已决定为我更新它,一旦解决了当前的错误,我将回滚)
  • 作曲家
  • Slim / Slim 3.0
  • Slim / php-view

我一直在使用Slim PHP框架构建API,并以gothinkster's repository为起点。尽管与渲染模板有关的所有代码均保持不变,但该代码已进行了大量修改。当我访问网站的主页时,index.phtml文件已正确呈现,但是尽管所有404文件都位于同一目录中,但是从主页上的任何超链接访问都会导致.phtml错误。

以下是我的代码的摘录,不包括无关的配置。尽管我只显示了一个端点,但是API使用驻留在同一文件夹中的.phtml文件定义了10个端点,所有这些端点都是不带参数的get请求。

使用index.php文件中的require语句调用设置,路由和依赖项。

/ [api_root] /public/index.php:

if (PHP_SAPI == 'cli-server') {

    $url  = parse_url($_SERVER['REQUEST_URI']);

    $file = __DIR__ . $url['path'];

    if (is_file($file)) {

        return false;

    }
}

require __DIR__ . '/../vendor/autoload.php';

session_start();

// Instantiate the app
$settings = require __DIR__ . '/../src/settings.php';

$app = new \Slim\App($settings);

// Set up dependencies
require __DIR__ . '/../src/dependencies.php';

// Register middleware
require __DIR__ . '/../src/middleware.php';

// Register routes
require __DIR__ . '/../src/routes.php';

// Run app
$app->run();

设置文件返回一个数组,其中包含对模板路径的引用。

[api_root] /src/settings.php:

'settings' => [
    'renderer' => [
        'template_path' => __DIR__ . '/../templates/',
    ]
]

模板已在dependencies.php文件中分配给渲染器。

[api_root] /src/dependencies.php:

$container = $app->getContainer();

// view renderer
$container['renderer'] = function ($c) {
    $settings = $c->get('settings')['renderer'];
    return new Slim\Views\PhpRenderer($settings['template_path']);
};

.phtml模板在get请求中呈现。

[api_root] /src/routes.php

$app->get('/getting-started',
    function (Request $request, Response $response) {
        return $this->renderer->render($response, 'getting-started.phtml');
    });

getting-started.phtml文件位于[api_root]/templates/中。

已定义根/,并成功返回了位于模板目录内的index.phtml文件,但是当我尝试访问主页中的任何链接时,都收到了404错误。指向入门页面的锚点成功重定向到mywebsiteurl.com/getting-started,但是未呈现模板文件,浏览器以404错误响应。

所有应用程序文件都私有存储在服务器上。我已经创建了从[api_root]/public文件夹的内容到我的网站的public_html文件夹的符号链接。

我对/templates目录路径的定义显然存在问题,但是我不知道如何纠正它。

编辑:

当我创建指向public_html文件夹的符号链接时,我忘记了包含隐藏文件(即.htaccess文件)。我已经创建了这个符号链接,尽管现在当我尝试访问主页时,我看到默认的apache2页面,该页面在安装apache之后显示。我会在这里指出,该网站位于付费服务器上。 Apache已配置为使用虚拟主机,并且我已经在本地计算机上正确编辑了hosts文件。如前所述,没有.htaccess文件,我可以查看主页,但是找不到其他路由。当.htaccess文件存在于public_html文件夹中时,我无法查看主页或任何其他路线。

.htaccess:

<IfModule mod_rewrite.c>
  RewriteEngine On

  RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
  RewriteCond %{HTTP_HOST} ^(www\.)?mywebsiteurl.com
  RewriteRule ^(.*) - [E=BASE:%1]

  # If the above doesn't work you might need to set the `RewriteBase` directive manually, it should be the
  # absolute physical path to the directory that contains this htaccess file.
  # RewriteBase /

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^ index.php [QSA,L]
</IfModule>

1 个答案:

答案 0 :(得分:0)

这里的问题是我尚未在服务器上启用mod_rewrite,因此无法读取我的.htaccess文件。