在 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'。
我有一个 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'。