public function getSaveHandler()
{
return $this->saveHandler;
}
/**
* {@inheritdoc}
*/
public function start()
{
if ($this->started) {
return true;
}
if (\PHP_SESSION_ACTIVE === session_status()) {
throw new \RuntimeException('Failed to start the session: already started by PHP.');
}
if (ini_get('session.use_cookies') && headers_sent($file, $line)) {
throw new \RuntimeException(sprintf('Failed to start the session because headers have already been sent by "%s" at line %d.', $file, $line));
}
// ok to try and start the session
if (!session_start()) {
throw new \RuntimeException('Failed to start the session');
}
$this->loadSession();
return true;
}
/**
* {@inheritdoc}
*/
public function getId()
{
return $this->saveHandler->getId();
}
if ($this->started) {
throw new \LogicException('Cannot register a bag when the session is already started.');
}
$this->bags[$bag->getName()] = $bag;
}
/**
* {@inheritdoc}
*/
public function getBag($name)
{
if (!isset($this->bags[$name])) {
throw new \InvalidArgumentException(sprintf('The SessionBagInterface %s is not registered.', $name));
}
if (!$this->started && $this->saveHandler->isActive()) {
$this->loadSession();
} elseif (!$this->started) {
$this->start();
}
return $this->bags[$name];
}
public function setMetadataBag(MetadataBag $metaBag = null)
{
if (null === $metaBag) {
$metaBag = new MetadataBag();
}
$this->metadataBag = $metaBag;
}
/**
* Gets the MetadataBag.
*
* @return MetadataBag
*/
public function getMetadataBag()
*/
public function getMetadataBag()
{
return $this->storage->getMetadataBag();
}
/**
* {@inheritdoc}
*/
public function registerBag(SessionBagInterface $bag)
{
$this->storage->registerBag(new SessionBagProxy($bag, $this->data, $this->hasBeenStarted));
}
/**
* {@inheritdoc}
*/
public function getBag($name)
{
return $this->storage->getBag($name)->getBag();
}
/**
* Gets the flashbag interface.
*
* @return FlashBagInterface
*/
public function getFlashBag()
{
return $this->getBag($this->flashName);
}
/**
* Gets the attributebag interface.
*
* Note that this method was added to help with IDE autocompletion.
*
* @return AttributeBagInterface
*/
private function getAttributeBag()
/**
* Gets the flashbag interface.
*
* @return FlashBagInterface
*/
public function getFlashBag()
{
return $this->getBag($this->flashName);
}
/**
* Gets the attributebag interface.
*
* Note that this method was added to help with IDE autocompletion.
*
* @return AttributeBagInterface
*/
private function getAttributeBag()
{
return $this->getBag($this->attributeName);
}
}
*/
public function start()
{
return $this->storage->start();
}
/**
* {@inheritdoc}
*/
public function has($name)
{
return $this->getAttributeBag()->has($name);
}
/**
* {@inheritdoc}
*/
public function get($name, $default = null)
{
return $this->getAttributeBag()->get($name, $default);
}
/**
* {@inheritdoc}
*/
public function set($name, $value)
{
$this->getAttributeBag()->set($name, $value);
}
/**
* {@inheritdoc}
*/
public function all()
{
return $this->getAttributeBag()->all();
}
/**
* {@inheritdoc}
* @deprecated
* Use isRegistered() instead
*/
public static function isLoggedIn()
{
$u = new User();
return $u->isRegistered();
}
/**
* @return bool
*/
public function checkLogin()
{
$app = Application::getFacadeApplication();
$session = $app['session'];
$config = $app['config'];
$aeu = $config->get('concrete.misc.access_entity_updated');
if ($aeu && $aeu > $session->get('accessEntitiesUpdated')) {
self::refreshUserGroups();
}
$invalidate = $app->make('Concrete\Core\Session\SessionValidatorInterface')->handleSessionValidation($session);
if ($invalidate) {
$this->loadError(USER_SESSION_EXPIRED);
}
if ($session->get('uID') > 0) {
$db = $app['database']->connection();
$row = $db->GetRow("select * from Users where uID = ? and uName = ?", array($session->get('uID'), $session->get('uName')));
$checkUID = (isset($row['uID'])) ? ($row['uID']) : (false);
if ($checkUID == $session->get('uID')) {
if (!$row['uIsActive']) {
return false;
}
if ($row['uLastPasswordChange'] > $session->get('uLastPasswordChange')) {
$parentthumb = $parentthumb!='' ? $ih->getThumbnail($parentthumb,600,400,'')->src : '';
$parenturl = $nh->getLinkToCollection($parent);
$langarea = '';
$langpath = '/';
// $ms = \Concrete\Core\Multilingual\Page\Section\Section::getCurrentSection();
// if (is_object($ms)) {
// if($ms->getLocale()!='en_US'){
// $langarea = '_'.$ms->getLocale();
// $langpath = $ms->getCollectionLink().'/';
// }
// }
define('SITE', $site);
define('THEMEDIR', $this->getThemePath());
define('PAGETYPE', $page->getCollectionTypeHandle());
define('PAGETEMPLATE', $template);
define('CHECKLOGIN', $ux->checkLogin());
define('PAGENAME', $page->getCollectionName());
define('PAGEDESC', $page->getCollectionDescription());
define('PAGETHUMB', $thumb);
define('PAGEID', $page->getCollectionID());
define('PAGEPATH', $nh->getLinkToCollection($page));
define('PARENTID', $page->getCollectionParentID());
define('PARENTNAME', $parent->getCollectionName());
define('PARENTTHUMB', $parentthumb);
define('PARENTPATH', $parenturl);
define('EDITMODE', $c->isEditMode());
define('METATITLE', $meta_title);
define('METADESC', $meta_desc);
define('LANGAREA', $langarea);
define('LANGPATH', $langpath);
define('DATEPUBLIC', $datePublic);
?>
$path = $env->getPath(DIRNAME_THEMES.'/'.$this->themeHandle.'/'.$file, $this->themePkgHandle);
if (!file_exists($path)) {
$path2 = $env->getPath(DIRNAME_THEMES.'/'.$this->themeHandle.'/'.$file, $this->viewPkgHandle);
if (file_exists($path2)) {
$path = $path2;
}
unset($path2);
}
$__data__['path'] = $path;
unset($file);
unset($args);
unset($env);
unset($path);
if (!empty($__data__['scopedItems'])) {
if (array_key_exists('__data__', $__data__['scopedItems'])) {
throw new \Exception(t(/*i18n: %1$s is a variable name, %2$s is a function name*/'Illegal variable name \'%1$s\' in %2$s args.', '__data__', __CLASS__.'::'.__METHOD__));
}
extract($__data__['scopedItems']);
}
include $__data__['path'];
}
/**
* A shortcut to posting back to the current page with a task and optional parameters. Only works in the context of.
*
* @param string $action
* @param string $task
*
* @return string $url
*/
public function action($action)
{
$a = func_get_args();
$controllerPath = $this->controller->getControllerActionPath();
array_unshift($a, $controllerPath);
$ret = call_user_func_array([$this, 'url'], $a);
return $ret;
}
<?php
// session_start();
defined('C5_EXECUTE') or die("Access Denied.");
$this->inc('elements/function.php');
?>
<!DOCTYPE html>
<html lang="<?php echo Localization::activeLanguage()?>">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta property="og:type" content="article" />
<meta property="og:title" content="<?php echo METATITLE; ?> :: <?php echo SITE; ?>" />
<meta property="og:description" content="<?php echo METADESC; ?>" />
<meta property="og:url" content="<?php echo PAGEPATH; ?>" />
<meta property="og:image" content="<?php echo PAGETHUMB; ?>" />
<meta property="og:image:alt" content="<?php echo METATITLE; ?>" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<?php if(PAGETEMPLATE=='formulation'):?>
<link rel="stylesheet" type="text/css" href="<?php echo $view->getThemePath()?>/libs/selectize/selectize.css">
<link rel="stylesheet" type="text/css" href="<?php echo $view->getThemePath()?>/css/formulation_autocomplete.css?v=<?= time();?>">
<?php endif; ?>
<link rel="stylesheet" type="text/css" href="<?php echo $view->getThemePath()?>/css/global.css?v=<?= time();?>">
<?php //echo $html->css($view->getStylesheet('global.css'))?>
<?php if('sub_product_level_none'==PAGETEMPLATE):?>
<link rel="stylesheet" type="text/css" href="<?php echo $view->getThemePath()?>/css/sub_product.css?v=<?= time();?>">
<?php endif; ?>
<?php if(PAGETYPE!=PAGETEMPLATE):?>
<?php $pagetypecss = $_SERVER['DOCUMENT_ROOT'].$view->getThemePath().'/css/'.PAGETYPE.'.css'; ?>
<?php if (file_exists($pagetypecss)) : ?>
<link rel="stylesheet" type="text/css" href="<?php echo $view->getThemePath()?>/css/<?php echo PAGETYPE;?>.css?v=<?= time();?>">
<?php endif; ?>
<?php endif; ?>
<?php $pagecss = $_SERVER['DOCUMENT_ROOT'].$view->getThemePath().'/css/'.PAGETEMPLATE.'.css'; ?>
<?php if (file_exists($pagecss)) : ?>
<link rel="stylesheet" type="text/css" href="<?php echo $view->getThemePath()?>/css/<?php echo PAGETEMPLATE;?>.css?v=<?= time();?>">
<?php endif; ?>
$path = $env->getPath(DIRNAME_THEMES.'/'.$this->themeHandle.'/'.$file, $this->themePkgHandle);
if (!file_exists($path)) {
$path2 = $env->getPath(DIRNAME_THEMES.'/'.$this->themeHandle.'/'.$file, $this->viewPkgHandle);
if (file_exists($path2)) {
$path = $path2;
}
unset($path2);
}
$__data__['path'] = $path;
unset($file);
unset($args);
unset($env);
unset($path);
if (!empty($__data__['scopedItems'])) {
if (array_key_exists('__data__', $__data__['scopedItems'])) {
throw new \Exception(t(/*i18n: %1$s is a variable name, %2$s is a function name*/'Illegal variable name \'%1$s\' in %2$s args.', '__data__', __CLASS__.'::'.__METHOD__));
}
extract($__data__['scopedItems']);
}
include $__data__['path'];
}
/**
* A shortcut to posting back to the current page with a task and optional parameters. Only works in the context of.
*
* @param string $action
* @param string $task
*
* @return string $url
*/
public function action($action)
{
$a = func_get_args();
$controllerPath = $this->controller->getControllerActionPath();
array_unshift($a, $controllerPath);
$ret = call_user_func_array([$this, 'url'], $a);
return $ret;
}
<?php defined('C5_EXECUTE') or die("Access Denied.");
$this->inc('elements/header_top.php');
?>
<!--
=======================================
Designed & built by KOS Design Co., Ltd
E-mail: hello(@)kos.co.th t: 02 7138625
Web: http://www.kos.co.th
=======================================
-->
<div id="overlay-load"></div>
<header>
<div class="top-header">
<div class="head-left">
<div class="head-logo">
<a href="/" id="logo"><img src="<?php echo THEMEDIR ?>/images/logo.svg" alt="<?php echo SITE; ?>"/></a>
</div>
<div class="head-title text-uppercase">
<div>
<?php
$header = new GlobalArea('head title');
$header->display();
?>
</div>
</div>
</div>
<div class="head-right xs-menu">
<div class="head-menu text-uppercase">
<div class="head-logo-xs text-center mb-4">
<a href="/"><img src="<?php echo THEMEDIR ?>/images/logo-white.svg" alt="<?php echo SITE; ?>"/></a>
</div>
<div class="main-menu">
<?php
$header = new GlobalArea('head menu');
$header->display();
?>
</div>
<div class="contact-menu">
<?php
$header = new GlobalArea('head contact menu');
$path = $env->getPath(DIRNAME_THEMES.'/'.$this->themeHandle.'/'.$file, $this->themePkgHandle);
if (!file_exists($path)) {
$path2 = $env->getPath(DIRNAME_THEMES.'/'.$this->themeHandle.'/'.$file, $this->viewPkgHandle);
if (file_exists($path2)) {
$path = $path2;
}
unset($path2);
}
$__data__['path'] = $path;
unset($file);
unset($args);
unset($env);
unset($path);
if (!empty($__data__['scopedItems'])) {
if (array_key_exists('__data__', $__data__['scopedItems'])) {
throw new \Exception(t(/*i18n: %1$s is a variable name, %2$s is a function name*/'Illegal variable name \'%1$s\' in %2$s args.', '__data__', __CLASS__.'::'.__METHOD__));
}
extract($__data__['scopedItems']);
}
include $__data__['path'];
}
/**
* A shortcut to posting back to the current page with a task and optional parameters. Only works in the context of.
*
* @param string $action
* @param string $task
*
* @return string $url
*/
public function action($action)
{
$a = func_get_args();
$controllerPath = $this->controller->getControllerActionPath();
array_unshift($a, $controllerPath);
$ret = call_user_func_array([$this, 'url'], $a);
return $ret;
}
<?php
defined('C5_EXECUTE') or die("Access Denied.");
$this->inc('elements/header.php'); ?>
<article>
<div class="section-top-banner parallax background">
<?php
$content = new Area('banner');
$content->display($c);
?>
<div class="page__name"><h1 class="font-black size-2"><?= PAGENAME;?></h1></div>
</div>
<div class="section-page-content">
<div class="page__list" id="product">
<div class="spash spash--top" data-enllax-ratio=".2" data-enllax-type="foreground">
<?php
$content = new Area('spash top - blog');
$content->display($c);
?>
</div>
<div class="container">
<div class="section__list">
<?php
$current = Page::getCurrentPage();
$area = $current->getBlocks('blog - list');
if(!is_null($area[0]->bID) && $area[0]->getBlockTypeHandle() == 'block_news_event_download' && !EDITMODE) {
$result = $controller->getBloackByID($area[0]->bID);
if($result['status']) {
?>
<div class="card-list row <?php echo $result['class'];?>" data-id="<?php echo $BID;?>"><?php echo $result['html'];?></div>
<?php if($result['paginator']->number_of_pages > 1) { ?>
<div class="ccm-search-results-pagination">
<div class="ccm-pagination-wrapper">
<ul class="pagination">
<?php echo $result['paginator']->getPages('li') ?>
</ul>
</div>
</div>
<?php } ?>
<?php
}
ob_end_clean();
return $innerContent;
}
/**
* Render the file set to $this->template
* @param $scopeItems
* @return string
*/
protected function renderTemplate($scopeItems, $innerContent)
{
// Extract the items into the current scope
extract($scopeItems);
ob_start();
// Fire a `before` event
$this->onBeforeGetContents();
include $this->template;
// Fire an `after` event
$this->onAfterGetContents();
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
public function finishRender($contents)
{
$event = new \Symfony\Component\EventDispatcher\GenericEvent();
$event->setArgument('view', $this);
Events::dispatch('on_render_complete', $event);
return $contents;
}
/**
* Function responsible for outputting header items.
protected function onBeforeGetContents()
{
$event = new \Symfony\Component\EventDispatcher\GenericEvent();
$event->setArgument('view', $this);
Events::dispatch('on_before_render', $event);
$this->themeObject->registerAssets();
}
public function renderViewContents($scopeItems)
{
$contents = '';
// Render the main view file
if ($this->innerContentFile) {
$contents = $this->renderInnerContents($scopeItems);
}
// Render the template around it
if (file_exists($this->template)) {
$contents = $this->renderTemplate($scopeItems, $contents);
}
return $contents;
}
/**
* Render the file set to $this->innerContentFile
* @param $scopeItems
* @return string
*/
protected function renderInnerContents($scopeItems)
{
// Extract the items into the current scope
extract($scopeItems);
ob_start();
include $this->innerContentFile;
$innerContent = ob_get_contents();
ob_end_clean();
$helpers = $this->controller->getHelperObjects();
$return = array_merge($this->scopeItems, $sets, $helpers);
} else {
$return = $this->scopeItems;
}
$return['view'] = $this;
$return['controller'] = $this->controller;
return $return;
}
public function render($state = false)
{
if ($this instanceof View) {
$this->setRequestInstance($this);
}
$this->start($state);
$this->setupRender();
$this->startRender();
$scopeItems = $this->getScopeItems();
$contents = $this->renderViewContents($scopeItems);
$contents = $this->postProcessViewContents($contents);
$response = $this->finishRender($contents);
if ($this instanceof View) {
$this->revertRequestInstance();
}
return $response;
}
public function renderViewContents($scopeItems)
{
if (file_exists($this->template)) {
extract($scopeItems);
ob_start();
$this->onBeforeGetContents();
include $this->template;
$this->onAfterGetContents();
$contents = ob_get_contents();
ob_end_clean();
$cnt = $this->app->make(PageForbidden::class);
$this->controller($cnt, $code, $headers);
}
/**
* {@inheritdoc}
*/
public function redirect($to, $code = Response::HTTP_MOVED_PERMANENTLY, $headers = [])
{
return RedirectResponse::create($to, $code, $headers);
}
/**
* {@inheritdoc}
*/
public function view(View $view, $code = Response::HTTP_OK, $headers = [])
{
$this->localization->pushActiveContext(Localization::CONTEXT_SITE);
try {
$contents = $view->render();
return $this->create($contents, $code, $headers);
} finally {
$this->localization->popActiveContext();
}
}
/**
* {@inheritdoc}
*/
public function controller(Controller $controller, $code = Response::HTTP_OK, $headers = [])
{
$this->localization->pushActiveContext(Localization::CONTEXT_SITE);
try {
$request = $this->request;
if ($response = $controller->on_start()) {
return $response;
}
if ($response = $controller->runAction('view')) {
return $response;
}
}
$view = $controller->getViewObject();
// Mobile theme
if ($this->config->get('concrete.misc.mobile_theme_id') > 0) {
$md = $this->app->make(MobileDetect::class);
if ($md->isMobile()) {
$mobileTheme = Theme::getByID($this->app->config->get('concrete.misc.mobile_theme_id'));
if ($mobileTheme instanceof Theme) {
$view->setViewTheme($mobileTheme);
$controller->setTheme($mobileTheme);
}
}
}
return $this->view($view, $code, $headers);
} finally {
$this->localization->popActiveContext();
}
}
/**
* {@inheritdoc}
*/
public function collection(Collection $collection, $code = Response::HTTP_OK, $headers = [])
{
if (!$this->app) {
throw new \RuntimeException('Cannot resolve collections without a reference to the application');
}
$request = $this->request;
if ($collection->isError() && $collection->getError() == COLLECTION_NOT_FOUND) {
if ($response = $this->collectionNotFound($collection, $request, $headers)) {
return $response;
}
require DIR_BASE_CORE . '/bootstrap/process.php';
$u = $this->app->make(User::class);
// On page view event.
$pe = new Event($collection);
$pe->setUser($u);
$pe->setRequest($request);
$this->app['director']->dispatch('on_page_view', $pe);
// Core menu items
$item = new RelationListItem();
$menu = $this->app->make('helper/concrete/ui/menu');
$menu->addMenuItem($item);
$controller = $collection->getPageController();
// we update the current page with the one bound to this controller.
$collection->setController($controller);
return $this->controller($controller);
}
private function collectionNotFound(Collection $collection, Request $request, array $headers)
{
// if we don't have a path and we're doing cID, then this automatically fires a 404.
if (!$request->getPath() && $request->get('cID')) {
return $this->notFound('', Response::HTTP_NOT_FOUND, $headers);
}
// let's test to see if this is, in fact, the home page,
// and we're routing arguments onto it (which is screwing up the path.)
$home = Page::getByID(Page::getHomePageID());
$request->setCurrentPage($home);
$homeController = $home->getPageController();
$homeController->setupRequestActionAndParameters($request);
$response = $homeController->validateRequest();
if ($response instanceof \Symfony\Component\HttpFoundation\Response) {
return $response;
} elseif ($response === true) {
protected $factory;
/**
* DispatcherRouteCallback constructor.
*
* @param $callback
* @param $factory
*/
public function __construct($callback, ResponseFactoryInterface $factory)
{
parent::__construct($callback);
$this->factory = $factory;
}
public function execute(Request $request, Route $route = null, $parameters = [])
{
// figure out where we need to go
$c = Page::getFromRequest($request);
return $this->factory->collection($c);
}
public static function getRouteAttributes($callback)
{
$callback = Core::make(self::class, [$callback]);
return ['callback' => $callback];
}
/**
* @deprecated Use CollectionResponseFactory
*
* @param \Concrete\Core\View\View $view
* @param int $code
*
* @return \Symfony\Component\HttpFoundation\Response
*/
protected function sendResponse(View $view, $code = 200)
{
return $this->factory->view($view, $code);
} else {
$context = new RequestContext();
$context->fromRequest($request);
$matcher = new UrlMatcher($collection, $context);
$callDispatcher = false;
try {
$matched = $matcher->match($path);
$request->attributes->add($matched);
$route = $collection->get($matched['_route']);
$this->router->setRequest($request);
$response = $this->router->execute($route, $matched);
} catch (ResourceNotFoundException $e) {
$callDispatcher = true;
} catch (MethodNotAllowedException $e) {
$callDispatcher = true;
}
}
if ($callDispatcher) {
$callback = $this->app->make(DispatcherRouteCallback::class, ['dispatcher']);
$response = $callback->execute($request);
}
return $response;
}
/**
* @param \Symfony\Component\Routing\RouteCollection $routes
* @param string $path
*
* @return \Symfony\Component\Routing\RouteCollection
*/
private function filterRouteCollectionForPath(RouteCollection $routes, $path)
{
$result = new RouteCollection();
foreach ($routes->getResources() as $resource) {
$result->addResource($resource);
}
foreach ($routes->all() as $name => $route) {
$routePath = $route->getPath();
$p = strpos($routePath, '{');
/**
* @param \Symfony\Component\HttpFoundation\Request $request
*
* @return SymfonyResponse
*/
public function dispatch(SymfonyRequest $request)
{
$path = rawurldecode($request->getPathInfo());
if (substr($path, 0, 3) == '../' || substr($path, -3) == '/..' || strpos($path, '/../') ||
substr($path, 0, 3) == '..\\' || substr($path, -3) == '\\..' || strpos($path, '\\..\\')) {
throw new \RuntimeException(t('Invalid path traversal. Please make this request with a valid HTTP client.'));
}
$response = null;
if ($this->app->isInstalled()) {
$response = $this->getEarlyDispatchResponse();
}
if ($response === null) {
$response = $this->handleDispatch($request);
}
return $response;
}
private function getEarlyDispatchResponse()
{
$validator = $this->app->make(SessionValidator::class);
if ($validator->hasActiveSession()) {
$session = $this->app['session'];
if (!$session->has('uID')) {
User::verifyAuthTypeCookie();
}
// User may have been logged in, so lets check status again.
if ($session->has('uID') && $session->get('uID') > 0 && $response = $this->validateUser()) {
return $response;
}
}
}
private $dispatcher;
/**
* DispatcherFrame constructor.
* @param \Concrete\Core\Http\DispatcherInterface $dispatcher
*/
public function __construct(DispatcherInterface $dispatcher)
{
$this->dispatcher = $dispatcher;
}
/**
* Dispatch the next available middleware and return the response.
*
* @param Request $request
* @return Response
*/
public function next(Request $request)
{
return $this->dispatcher->dispatch($request);
}
}
* @var \Concrete\Core\Config\Repository\Repository
*/
private $config;
public function __construct(Repository $config)
{
$this->config = $config;
}
/**
* Process the request and return a response.
*
* @param \Symfony\Component\HttpFoundation\Request $request
* @param DelegateInterface $frame
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function process(Request $request, DelegateInterface $frame)
{
$response = $frame->next($request);
// if the thumbnail generator is async, we do not use the thumbnail middleware.
if ($this->app->isInstalled() && $this->config->get('concrete.misc.basic_thumbnailer_generation_strategy') == 'now') {
if ($response->getStatusCode() == 200) {
/* @var Connection $database */
try {
$database = $this->getConnection();
} catch (\InvalidArgumentException $e) {
// Don't die here if there's no available database connection
$database = null;
}
if ($database) {
try {
$paths = $database->executeQuery('SELECT * FROM FileImageThumbnailPaths WHERE isBuilt=0 LIMIT 5');
if ($paths->rowCount()) {
$this->generateThumbnails($paths, $database);
}
} catch (InvalidFieldNameException $e) {
/**
* @var \Concrete\Core\Http\Middleware\DelegateInterface
*/
private $nextDelegate;
public function __construct(MiddlewareInterface $middleware, DelegateInterface $nextDelegate)
{
$this->middleware = $middleware;
$this->nextDelegate = $nextDelegate;
}
/**
* Dispatch the next available middleware and return the response.
*
* @param Request $request
* @return Response
*/
public function next(Request $request)
{
return $this->middleware->process($request, $this->nextDelegate);
}
}
private $config;
/**
* @var \Concrete\Core\Utility\Service\Validation\Strings
*/
private $stringValidator;
public function __construct(Repository $config, Strings $stringValidator)
{
$this->config = $config;
$this->stringValidator = $stringValidator;
}
/**
* @param \Concrete\Core\Http\Middleware\DelegateInterface $frame
* @return Response
*/
public function process(Request $request, DelegateInterface $frame)
{
$response = $frame->next($request);
if ($response->headers->has('X-Frame-Options') === false) {
$x_frame_options = $this->config->get('concrete.security.misc.x_frame_options');
if ($this->stringValidator->notempty($x_frame_options)) {
$response->headers->set('X-Frame-Options', $x_frame_options);
}
}
return $response;
}
}
/**
* @var \Concrete\Core\Http\Middleware\DelegateInterface
*/
private $nextDelegate;
public function __construct(MiddlewareInterface $middleware, DelegateInterface $nextDelegate)
{
$this->middleware = $middleware;
$this->nextDelegate = $nextDelegate;
}
/**
* Dispatch the next available middleware and return the response.
*
* @param Request $request
* @return Response
*/
public function next(Request $request)
{
return $this->middleware->process($request, $this->nextDelegate);
}
}
*/
private $cookies;
public function __construct(CookieJar $cookies)
{
$this->cookies = $cookies;
}
/**
* Add or remove cookies from the
* @param Request $request
* @param \Concrete\Core\Http\Middleware\DelegateInterface $frame
* @return Response
*/
public function process(Request $request, DelegateInterface $frame)
{
$this->cookies->setRequest($request);
/** @var Response $response */
$response = $frame->next($request);
$cleared = $this->cookies->getClearedCookies();
foreach ($cleared as $cookie) {
$response->headers->clearCookie($cookie, DIR_REL . '/');
}
$cookies = $this->cookies->getCookies();
foreach ($cookies as $cookie) {
$response->headers->setCookie($cookie);
}
return $response;
}
}
/**
* @var \Concrete\Core\Http\Middleware\DelegateInterface
*/
private $nextDelegate;
public function __construct(MiddlewareInterface $middleware, DelegateInterface $nextDelegate)
{
$this->middleware = $middleware;
$this->nextDelegate = $nextDelegate;
}
/**
* Dispatch the next available middleware and return the response.
*
* @param Request $request
* @return Response
*/
public function next(Request $request)
{
return $this->middleware->process($request, $this->nextDelegate);
}
}
* Middleware for applying state changes to the application
* @package Concrete\Core\Http\Middleware
*/
class ApplicationMiddleware implements MiddlewareInterface, ApplicationAwareInterface
{
use ApplicationAwareTrait;
/**
* Apply the request instance to the request singleton
* @param \Symfony\Component\HttpFoundation\Request $request
* @param \Concrete\Core\Http\Middleware\DelegateInterface $frame
* @return \Symfony\Component\HttpFoundation\Response
*/
public function process(Request $request, DelegateInterface $frame)
{
\Concrete\Core\Http\Request::setInstance($request);
$this->app->instance('Concrete\Core\Http\Request', $request);
return $frame->next($request);
}
}
/**
* @var \Concrete\Core\Http\Middleware\DelegateInterface
*/
private $nextDelegate;
public function __construct(MiddlewareInterface $middleware, DelegateInterface $nextDelegate)
{
$this->middleware = $middleware;
$this->nextDelegate = $nextDelegate;
}
/**
* Dispatch the next available middleware and return the response.
*
* @param Request $request
* @return Response
*/
public function next(Request $request)
{
return $this->middleware->process($request, $this->nextDelegate);
}
}
public function withoutMiddleware(MiddlewareInterface $middleware)
{
$stack = clone $this;
$stack->middleware = array_map(function($priorityGroup) use ($middleware) {
return array_map(function($stackMiddleware) use ($middleware) {
return $middleware === $stackMiddleware ? null : $stackMiddleware;
}, $priorityGroup);
}, $stack->middleware);
return $stack;
}
/**
* @inheritdoc
*/
public function process(Request $request)
{
$stack = $this->getStack();
return $stack->next($request);
}
/**
* Reduce middleware into a stack of functions that each call the next
* @return callable
*/
private function getStack()
{
$processed = [];
foreach ($this->middlewareGenerator() as $middleware) {
$processed[] = $middleware;
}
$middleware = array_reverse($processed);
$stack = array_reduce($middleware, $this->getZipper(), $this->dispatcher);
return $stack;
}
*/
public function removeMiddleware(MiddlewareInterface $middleware)
{
$this->stack = $this->stack->withoutMiddleware($middleware);
return $this;
}
/**
* Take a request and pass it through middleware, then return the response
* @param SymfonyRequest $request
* @return SymfonyResponse
*/
public function handleRequest(SymfonyRequest $request)
{
$stack = $this->stack;
if ($stack instanceof MiddlewareStack) {
$stack = $stack->withDispatcher($this->app->make(DispatcherDelegate::class, [$this->dispatcher]));
}
return $stack->process($request);
}
}
'registerLegacyRoutes',
// Register legacy config values
'registerLegacyConfigValues',
// Handle loading permission keys
'handlePermissionKeys',
// Handle eventing
'handleEventing',
]);
} else {
$this->initializeSystemTimezone();
}
// Create the request to use
$request = $this->createRequest();
if (!$response) {
$response = $this->server->handleRequest($request);
}
// Prepare and return the response
return $response->prepare($request);
}
/**
* Define the base url if not defined
* This will define `BASE_URL` to whatever is resolved from the resolver.
*
* @deprecated In a future major version this will be part of HTTP middleware
*
* @return Response|void Returns a response if an error occurs
*/
protected function initializeLegacyURLDefinitions()
{
if (!defined('BASE_URL')) {
$resolver = $this->getUrlResolver();
try {
$this->status = self::STATUS_ACTIVE;
}
}
/**
* Begin the runtime.
*/
public function run()
{
switch ($this->status) {
case self::STATUS_ENDED:
// We've already ended, lets just return
return;
case self::STATUS_INACTIVE:
throw new \RuntimeException('Runtime has not yet booted.');
}
$runner = $this->getRunner();
$response = $runner->run();
if ($response) {
$this->sendResponse($response);
}
return $response;
}
/**
* The method that handles properly sending a response.
*
* @param \Symfony\Component\HttpFoundation\Response $response
*/
protected function sendResponse(Response $response)
{
$response->send();
// Set the status to ended
$this->status = self::STATUS_ENDED;
}
* Include all autoloaders.
* ----------------------------------------------------------------------------
*/
require __DIR__ . '/bootstrap/autoload.php';
/*
* ----------------------------------------------------------------------------
* Begin concrete5 startup.
* ----------------------------------------------------------------------------
*/
$app = require __DIR__ . '/bootstrap/start.php';
/** @var \Concrete\Core\Application\Application $app */
/*
* ----------------------------------------------------------------------------
* Run the runtime.
* ----------------------------------------------------------------------------
*/
$runtime = $app->getRuntime();
if ($response = $runtime->run()) {
/*
* ------------------------------------------------------------------------
* Shut it down.
* ------------------------------------------------------------------------
*/
$app->shutdown();
} else {
return $app;
}
<?php require 'concrete/dispatcher.php';
| Key | Value |
| Version | 8.4.4 |
| Installed Version | 8.4.4 |
| Key | Value |
| concrete.version | 8.4.4 |
| concrete.version_installed | 8.4.4 |
| concrete.version_db | 20180717000000 |
| concrete.installed | true |
| concrete.locale | en_US |
| concrete.charset | UTF-8 |
| concrete.maintenance_mode | false |
| concrete.debug.display_errors | true |
| concrete.debug.detail | debug |
| concrete.debug.error_reporting | null |
| concrete.proxy.host | null |
| concrete.proxy.port | null |
| concrete.proxy.user | null |
| concrete.proxy.password | null |
| concrete.upload.extensions | *.flv;*.jpg;*.gif;*.jpeg;*.ico;*.docx;*.xla;*.png;*.psd;*.swf;*.doc;*.txt;*.xls;*.xlsx;*.csv;*.pdf;*.tiff;*.rtf;*.m4a;*.mov;*.wmv;*.mpeg;*.mpg;*.wav;*.3gp;*.avi;*.m4v;*.mp4;*.mp3;*.qt;*.ppt;*.pptx;*.kml;*.xml;*.svg;*.webm;*.ogg;*.ogv |
| concrete.interface.panel.page_relations | false |
| concrete.mail.method | PHP_MAIL |
| concrete.mail.methods.smtp.server | |
| concrete.mail.methods.smtp.port | |
| concrete.mail.methods.smtp.username | |
| concrete.mail.methods.smtp.password | |
| concrete.mail.methods.smtp.encryption | |
| concrete.mail.methods.smtp.messages_per_connection | null |
| concrete.cache.enabled | true |
| concrete.cache.lifetime | 21600 |
| concrete.cache.overrides | true |
| concrete.cache.blocks | true |
| concrete.cache.assets | true |
| concrete.cache.theme_css | true |
| concrete.cache.pages | all |
| concrete.cache.doctrine_dev_mode | false |
| concrete.cache.full_page_lifetime | default |
| concrete.cache.full_page_lifetime_value | null |
| concrete.cache.full_contents_assets_hash | false |
| concrete.cache.directory | /srv/users/vbi/apps/vbi/public/application/files/cache |
| concrete.cache.directory_relative | null |
| concrete.cache.page.directory | /srv/users/vbi/apps/vbi/public/application/files/cache/pages |
| concrete.cache.page.adapter | file |
| concrete.cache.levels.overrides.drivers.core_ephemeral.class | \Stash\Driver\Ephemeral |
| concrete.cache.levels.overrides.drivers.core_filesystem.class | Concrete\Core\Cache\Driver\FileSystemStashDriver |
| concrete.cache.levels.overrides.drivers.core_filesystem.options.path | /srv/users/vbi/apps/vbi/public/application/files/cache/overrides |
| concrete.cache.levels.overrides.drivers.core_filesystem.options.dirPermissions | 509 |
| concrete.cache.levels.overrides.drivers.core_filesystem.options.filePermissions | 436 |
| concrete.cache.levels.expensive.drivers.core_ephemeral.class | \Stash\Driver\Ephemeral |
| concrete.cache.levels.expensive.drivers.core_filesystem.class | Concrete\Core\Cache\Driver\FileSystemStashDriver |
| concrete.cache.levels.expensive.drivers.core_filesystem.options.path | /srv/users/vbi/apps/vbi/public/application/files/cache/expensive |
| concrete.cache.levels.expensive.drivers.core_filesystem.options.dirPermissions | 509 |
| concrete.cache.levels.expensive.drivers.core_filesystem.options.filePermissions | 436 |
| concrete.cache.levels.object.drivers.core_ephemeral.class | \Stash\Driver\Ephemeral |
| concrete.cache.clear.thumbnails | false |
| concrete.design.enable_custom | true |
| concrete.design.enable_layouts | true |
| concrete.log.emails | true |
| concrete.log.errors | true |
| concrete.log.spam | false |
| concrete.log.queries.log | false |
| concrete.log.queries.clear_on_reload | false |
| concrete.jobs.enable_scheduling | true |
| concrete.filesystem.temp_directory | null |
| concrete.filesystem.permissions.file | 436 |
| concrete.filesystem.permissions.directory | 509 |
| concrete.email.enabled | true |
| concrete.email.default.address | no-reply@kos.co.th |
| concrete.email.default.name | |
| concrete.email.form_block.address | no-reply@kos.co.th |
| concrete.email.form_block.name | |
| concrete.email.forgot_password.address | no-reply@kos.co.th |
| concrete.email.forgot_password.name | |
| concrete.email.validate_registration.address | null |
| concrete.email.validate_registration.name | null |
| concrete.email.workflow_notification.address | null |
| concrete.email.workflow_notification.name | null |
| concrete.form.store_form_submissions | auto |
| concrete.marketplace.enabled | true |
| concrete.marketplace.request_timeout | 30 |
| concrete.marketplace.token | null |
| concrete.marketplace.site_token | null |
| concrete.marketplace.intelligent_search | true |
| concrete.marketplace.log_requests | false |
| concrete.external.intelligent_search_help | true |
| concrete.external.news | true |
| concrete.misc.user_timezones | false |
| concrete.misc.package_backup_directory | /srv/users/vbi/apps/vbi/public/application/files/trash |
| concrete.misc.enable_progressive_page_reindex | true |
| concrete.misc.mobile_theme_id | 0 |
| concrete.misc.sitemap_approve_immediately | true |
| concrete.misc.enable_translate_locale_en_us | false |
| concrete.misc.page_search_index_lifetime | 259200 |
| concrete.misc.enable_trash_can | true |
| concrete.misc.app_version_display_in_header | true |
| concrete.misc.default_jpeg_image_compression | 90 |
| concrete.misc.default_png_image_compression | 9 |
| concrete.misc.default_thumbnail_format | auto |
| concrete.misc.basic_thumbnailer_generation_strategy | now |
| concrete.misc.help_overlay | true |
| concrete.misc.require_version_comments | false |
| concrete.misc.enable_move_blocktypes_across_sets | false |
| concrete.misc.login_redirect | HOMEPAGE |
| concrete.misc.access_entity_updated | 1547885417 |
| concrete.misc.login_redirect_cid | 0 |
| concrete.misc.do_page_reindex_check | false |
| concrete.misc.latest_version | 8.4.4 |
| concrete.theme.compress_preprocessor_output | true |
| concrete.theme.generate_less_sourcemap | false |
| concrete.updates.enable_auto_update_packages | false |
| concrete.updates.enable_permissions_protection | true |
| concrete.updates.check_threshold | 172800 |
| concrete.updates.services.get_available_updates | http://www.concrete5.org/tools/update_core |
| concrete.updates.services.inspect_update | http://www.concrete5.org/tools/inspect_update |
| concrete.paths.trash | /!trash |
| concrete.paths.drafts | /!drafts |
| concrete.icons.page_template.width | 120 |
| concrete.icons.page_template.height | 90 |
| concrete.icons.theme_thumbnail.width | 120 |
| concrete.icons.theme_thumbnail.height | 90 |
| concrete.icons.file_manager_listing.handle | file_manager_listing |
| concrete.icons.file_manager_listing.width | 60 |
| concrete.icons.file_manager_listing.height | 60 |
| concrete.icons.file_manager_detail.handle | file_manager_detail |
| concrete.icons.file_manager_detail.width | 400 |
| concrete.icons.file_manager_detail.height | 400 |
| concrete.icons.user_avatar.width | 80 |
| concrete.icons.user_avatar.height | 80 |
| concrete.icons.user_avatar.default | /concrete/images/avatar_none.png |
| concrete.file_manager.images.use_exif_data_to_rotate_images | false |
| concrete.file_manager.images.manipulation_library | gd |
| concrete.file_manager.images.create_high_dpi_thumbnails | true |
| concrete.file_manager.results | 10 |
| concrete.file_manager.restrict_max_width | 1920 |
| concrete.file_manager.restrict_max_height | 1080 |
| concrete.search_users.results | 10 |
| concrete.sitemap_xml.file | sitemap.xml |
| concrete.sitemap_xml.frequency | weekly |
| concrete.sitemap_xml.priority | 0.5 |
| concrete.accessibility.toolbar_titles | false |
| concrete.accessibility.toolbar_large_font | false |
| concrete.accessibility.display_help_system | true |
| concrete.accessibility.toolbar_tooltips | true |
| concrete.i18n.choose_language_login | false |
| concrete.i18n.auto_install_package_languages | true |
| concrete.i18n.community_translation.entry_point | http://translate.concrete5.org/api |
| concrete.i18n.community_translation.api_token | |
| concrete.i18n.community_translation.progress_limit | 60 |
| concrete.i18n.community_translation.cache_lifetime | 3600 |
| concrete.i18n.community_translation.package_url | https://translate.concrete5.org/translate/package |
| concrete.urls.concrete5 | http://www.concrete5.org |
| concrete.urls.concrete5_secure | https://www.concrete5.org |
| concrete.urls.newsflow | http://newsflow.concrete5.org |
| concrete.urls.background_feed | //backgroundimages.concrete5.org/wallpaper |
| concrete.urls.privacy_policy | //www.concrete5.org/legal/privacy-policy |
| concrete.urls.background_feed_secure | https://backgroundimages.concrete5.org/wallpaper |
| concrete.urls.background_info | http://backgroundimages.concrete5.org/get_image_data.php |
| concrete.urls.videos | https://www.youtube.com/user/concrete5cms/videos |
| concrete.urls.help.developer | http://documentation.concrete5.org/developers |
| concrete.urls.help.user | http://documentation.concrete5.org/editors |
| concrete.urls.help.forum | http://www.concrete5.org/community/forums |
| concrete.urls.help.slack | https://www.concrete5.org/slack |
| concrete.urls.paths.menu_help_service | /tools/get_remote_help_list/ |
| concrete.urls.paths.site_page | /private/sites |
| concrete.urls.paths.newsflow_slot_content | /tools/slot_content/ |
| concrete.urls.paths.marketplace.connect | /marketplace/connect |
| concrete.urls.paths.marketplace.connect_success | /marketplace/connect/-/connected |
| concrete.urls.paths.marketplace.connect_validate | /marketplace/connect/-/validate |
| concrete.urls.paths.marketplace.connect_new_token | /marketplace/connect/-/generate_token |
| concrete.urls.paths.marketplace.checkout | /cart/-/add |
| concrete.urls.paths.marketplace.purchases | /marketplace/connect/-/get_available_licenses |
| concrete.urls.paths.marketplace.item_information | /marketplace/connect/-/get_item_information |
| concrete.urls.paths.marketplace.item_free_license | /marketplace/connect/-/enable_free_license |
| concrete.urls.paths.marketplace.remote_item_list | /marketplace/ |
| concrete.white_label.logo | false |
| concrete.white_label.name | false |
| concrete.white_label.background_image | null |
| concrete.session.name | CONCRETE5 |
| concrete.session.handler | file |
| concrete.session.save_path | null |
| concrete.session.max_lifetime | 7200 |
| concrete.session.cookie.cookie_path | false |
| concrete.session.cookie.cookie_lifetime | 0 |
| concrete.session.cookie.cookie_domain | false |
| concrete.session.cookie.cookie_secure | false |
| concrete.session.cookie.cookie_httponly | true |
| concrete.user.registration.enabled | false |
| concrete.user.registration.type | disabled |
| concrete.user.registration.captcha | true |
| concrete.user.registration.email_registration | false |
| concrete.user.registration.display_username_field | true |
| concrete.user.registration.display_confirm_password_field | true |
| concrete.user.registration.validate_email | false |
| concrete.user.registration.approval | false |
| concrete.user.registration.notification | false |
| concrete.user.group.badge.default_point_value | 50 |
| concrete.user.username.maximum | 64 |
| concrete.user.username.minimum | 3 |
| concrete.user.username.allowed_characters.boundary | A-Za-z0-9 |
| concrete.user.username.allowed_characters.middle | A-Za-z0-9_\. |
| concrete.user.username.allowed_characters.requirement_string | A username may only contain letters, numbers, dots (not at the beginning/end), underscores (not at the beginning/end). |
| concrete.user.username.allowed_characters.error_string | A username may only contain letters, numbers, dots (not at the beginning/end), underscores (not at the beginning/end). |
| concrete.user.password.maximum | 128 |
| concrete.user.password.minimum | 5 |
| concrete.user.password.hash_portable | false |
| concrete.user.password.hash_cost_log2 | 12 |
| concrete.user.password.legacy_salt | |
| concrete.user.email.test_mx_record | false |
| concrete.user.email.strict | true |
| concrete.user.private_messages.throttle_max | 20 |
| concrete.user.private_messages.throttle_max_timespan | 15 |
| concrete.user.deactivation.enable_login_threshold_deactivation | false |
| concrete.user.deactivation.login.threshold | 120 |
| concrete.user.deactivation.message | This user is inactive. Please contact us regarding this account. |
| concrete.spam.whitelist_group | 0 |
| concrete.spam.notify_email | |
| concrete.calendar.colors.text | #ffffff |
| concrete.calendar.colors.background | #3A87AD |
| concrete.security.session.invalidate_on_user_agent_mismatch | true |
| concrete.security.session.invalidate_on_ip_mismatch | true |
| concrete.security.ban.ip.enabled | false |
| concrete.security.ban.ip.attempts | 5 |
| concrete.security.ban.ip.time | 300 |
| concrete.security.ban.ip.length | 10 |
| concrete.security.ban.session.invalidate_on_ip_mismatch | false |
| concrete.security.misc.x_frame_options | SAMEORIGIN |
| concrete.permissions.forward_to_login | true |
| concrete.permissions.model | simple |
| concrete.seo.exclude_words | a, an, as, at, before, but, by, for, from, is, in, into, like, of, off, on, onto, per, since, than, the, this, that, to, up, via, with |
| concrete.seo.url_rewriting | true |
| concrete.seo.url_rewriting_all | false |
| concrete.seo.redirect_to_canonical_url | 0 |
| concrete.seo.canonical_url | null |
| concrete.seo.canonical_url_alternative | null |
| concrete.seo.trailing_slash | false |
| concrete.seo.title_format | %2$s - %1$s |
| concrete.seo.title_segment_separator | - |
| concrete.seo.page_path_separator | - |
| concrete.seo.group_name_separator | / |
| concrete.seo.segment_max_length | 128 |
| concrete.seo.paging_string | ccm_paging_p |
| concrete.statistics.track_downloads | true |
| concrete.limits.sitemap_pages | 1000 |
| concrete.limits.delete_pages | 100 |
| concrete.limits.copy_pages | 10 |
| concrete.limits.page_search_index_batch | 200 |
| concrete.limits.job_queue_batch | 10 |
| concrete.limits.style_customizer.size_min | -50 |
| concrete.limits.style_customizer.size_max | 200 |
| concrete.page.search.always_reindex | false |
| concrete.composer.idle_timeout | 1 |
| concrete.version_db_installed | 20180717000000 |
| concrete.maintenance.version_job_page_num | 180 |
| concrete.site | VBI |
| Key | Value |
| TMP | /srv/users/vbi/tmp/vbi |
| TEMP | /srv/users/vbi/tmp/vbi |
| TMPDIR | /srv/users/vbi/tmp/vbi |
| PATH | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin |
| USER | vbi |
| HOME | /srv/users/vbi |
| SCRIPT_NAME | /index.php |
| REQUEST_URI | /technical-information |
| QUERY_STRING | |
| REQUEST_METHOD | GET |
| SERVER_PROTOCOL | HTTP/1.0 |
| GATEWAY_INTERFACE | CGI/1.1 |
| REDIRECT_URL | /technical-information |
| REMOTE_PORT | 18232 |
| SCRIPT_FILENAME | /srv/users/vbi/apps/vbi/public/index.php |
| SERVER_ADMIN | webmaster@ |
| CONTEXT_DOCUMENT_ROOT | /srv/users/vbi/apps/vbi/public |
| CONTEXT_PREFIX | |
| REQUEST_SCHEME | https |
| DOCUMENT_ROOT | /srv/users/vbi/apps/vbi/public |
| REMOTE_ADDR | 216.73.216.158 |
| SERVER_PORT | 443 |
| SERVER_ADDR | 127.0.0.1 |
| SERVER_NAME | www.vbi.co.th |
| SERVER_SOFTWARE | Apache/2.4.65 (Unix) OpenSSL/1.0.2g |
| SERVER_SIGNATURE | |
| LD_LIBRARY_PATH | /opt/sp/apache/lib:/opt/sp/apache/lib |
| HTTP_REFERER | https://vbi.co.th/technical-information |
| HTTP_ACCEPT_ENCODING | gzip, br, zstd, deflate |
| HTTP_USER_AGENT | Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com) |
| HTTP_ACCEPT | */* |
| HTTP_CONNECTION | close |
| HTTP_X_FORWARDED_PROTO | https |
| HTTP_X_FORWARDED_SSL | on |
| HTTP_X_FORWARDED_FOR | 216.73.216.158 |
| HTTP_HOST | www.vbi.co.th |
| SCRIPT_URI | https://www.vbi.co.th/technical-information |
| SCRIPT_URL | /technical-information |
| HTTPS | on |
| REDIRECT_STATUS | 200 |
| REDIRECT_SCRIPT_URI | https://www.vbi.co.th/technical-information |
| REDIRECT_SCRIPT_URL | /technical-information |
| REDIRECT_HTTPS | on |
| FCGI_ROLE | RESPONDER |
| PHP_SELF | /index.php |
| REQUEST_TIME_FLOAT | 1761681656.0991 |
| REQUEST_TIME | 1761681656 |
| argv | Array ( ) |
| argc | 0 |
| Key | Value |
| TMP | /srv/users/vbi/tmp/vbi |
| TEMP | /srv/users/vbi/tmp/vbi |
| TMPDIR | /srv/users/vbi/tmp/vbi |
| PATH | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin |
| USER | vbi |
| HOME | /srv/users/vbi |
| SCRIPT_NAME | /index.php |
| REQUEST_URI | /technical-information |
| QUERY_STRING | |
| REQUEST_METHOD | GET |
| SERVER_PROTOCOL | HTTP/1.0 |
| GATEWAY_INTERFACE | CGI/1.1 |
| REDIRECT_URL | /technical-information |
| REMOTE_PORT | 18232 |
| SCRIPT_FILENAME | /srv/users/vbi/apps/vbi/public/index.php |
| SERVER_ADMIN | webmaster@ |
| CONTEXT_DOCUMENT_ROOT | /srv/users/vbi/apps/vbi/public |
| CONTEXT_PREFIX | |
| REQUEST_SCHEME | https |
| DOCUMENT_ROOT | /srv/users/vbi/apps/vbi/public |
| REMOTE_ADDR | 216.73.216.158 |
| SERVER_PORT | 443 |
| SERVER_ADDR | 127.0.0.1 |
| SERVER_NAME | www.vbi.co.th |
| SERVER_SOFTWARE | Apache/2.4.65 (Unix) OpenSSL/1.0.2g |
| SERVER_SIGNATURE | |
| LD_LIBRARY_PATH | /opt/sp/apache/lib:/opt/sp/apache/lib |
| HTTP_REFERER | https://vbi.co.th/technical-information |
| HTTP_ACCEPT_ENCODING | gzip, br, zstd, deflate |
| HTTP_USER_AGENT | Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com) |
| HTTP_ACCEPT | */* |
| HTTP_CONNECTION | close |
| HTTP_X_FORWARDED_PROTO | https |
| HTTP_X_FORWARDED_SSL | on |
| HTTP_X_FORWARDED_FOR | 216.73.216.158 |
| HTTP_HOST | www.vbi.co.th |
| SCRIPT_URI | https://www.vbi.co.th/technical-information |
| SCRIPT_URL | /technical-information |
| HTTPS | on |
| REDIRECT_STATUS | 200 |
| REDIRECT_SCRIPT_URI | https://www.vbi.co.th/technical-information |
| REDIRECT_SCRIPT_URL | /technical-information |
| REDIRECT_HTTPS | on |
| FCGI_ROLE | RESPONDER |
| PHP_SELF | /index.php |
| REQUEST_TIME_FLOAT | 1761681656.0991 |
| REQUEST_TIME | 1761681656 |
| argv | Array ( ) |
| argc | 0 |