在 Slim 中间件中获取基本路径

Getting the base path in a Slim middleware

我有一个 Slim 4 应用程序,我正在尝试设置一个将非 https 重定向到 https 的中间件。所以如果我输入

this_website.com

在浏览器中,这会自动重定向到 https://this_website.com

我有一个使用 Slim 3 构建的早期网站,我可以使用以下内容:

final class FullHttpsMiddleware {

    public function __invoke($request, $handler) {

        $response = $handler->handle($request);

        if($request->getUri()->getScheme() !== 'https' ){

            if($request->getUri()->getPath() != '/') {
                $response = $response->withStatus(302)->withHeader('Location', 'https://' . $request->getUri()->getHost() . $request->getUri()->getBasePath() . '/' . $request->getUri()->getPath() );
            } else {
                $response = $response->withStatus(302)->withHeader('Location', 'https://' . $request->getUri()->getHost() . $request->getUri()->getBasePath() );
            }
        }

        return $response;
    }
}

问题是 $request->getUri()->getBasePath() 在 Slim 4 中不存在。我如何更改此代码以在 Slim 4 上工作?

我写了一篇关于这个主题的博客post:Slim 4 - HTTPS Middleware

您还可以使用 .htaccess 文件将 http 流量重定向到 https。

如果您的 .htaccess 中已有代码,请添加以下内容:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

解决方案 1(您真正应该做的)

从 http 到 https 的重定向不应在应用程序级别完成,而应使用 .htaccess。

方法如下:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

解决方案 2(字面上的问题)

您要求 问题是 $request->getUri()->getBasePath() 在 Slim 4 中不存在。如何更改此代码以在 Slim 4 上工作?

总结

我有一个settings.php,defines/retrieves路径设置正确,包括$settings['root']。我可以轻松地从路由、中间件等访问这些设置。

当然,你需要在settings.php中添加你需要的值,比如this_website.com

container.php

settings.php 包含(必需)来自 container.php:

return [
    'settings' => function () {
        return require __DIR__ . '/settings.php';
    },
...
];

settings.php

这是我的settings.php。 重要说明:这些是测试环境的值,它们必须更改以用于生产

// Should be set to 0 in production
error_reporting(E_ALL);

// Should be set to '0' in production
ini_set('display_errors', '1');

// Timezone
date_default_timezone_set('FILL_IN_YOUR_TIMEZONE');

// Settings
$settings = [];

// Path settings
$settings['root'] = dirname(__DIR__);
$settings['temp'] = $settings['root'] . '/tmp';
$settings['public'] = $settings['root'] . '/public_html';

// Error Handling Middleware settings
$settings['error'] = [

    // Should be set to false in production
    'display_error_details' => true,

    // Parameter is passed to the default ErrorHandler
    // View in rendered output by enabling the "displayErrorDetails" setting.
    // For the console and unit tests we also disable it
    'log_errors' => true,

    // Display error details in error log
    'log_error_details' => true,
];

return $settings;

如何访问

现在,您可以使用

访问路径设置 im Slim 4
$app->get('settings')

或者,例如。当你在一条路线内时,你必须使用 $this 作为 $app,当然:

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

$app->get('/wiki/{id:[1-9]\d*}/edit'), function (ServerRequestInterface $request, ResponseInterface $response) {
   ...
   $filename = $this->get('settings')['root'].'/src/content/wiki/edit.html';
   ...
   return (...);
});

$filename 现在是 /var/www(在我的系统上)。添加适当的设置后,您现在可以从中间件访问 'this_website.com'。