Files
MageSail/Magesail/Plugin/Backend/App/Area/TunnelBackendFrontNameResolverPlugin.php
T
2026-03-21 03:01:08 -05:00

53 lines
1.8 KiB
PHP

<?php
declare(strict_types=1);
namespace MageSail\Magesail\Plugin\Backend\App\Area;
use Magento\Backend\App\Area\FrontNameResolver;
use Magento\Framework\App\Request\Http;
use Magento\Framework\App\RequestInterface;
use MageSail\Magesail\Model\TunnelRequestDetector;
/**
* When the tunnel is used, HTTP_HOST is often dev.myshop.local while default backend base URLs point at production.
* {@see FrontNameResolver::getFrontName(true)} then returns false, so {@see \Magento\Framework\App\AreaList}
* never maps the admin front name to adminhtml and /admin_* is dispatched as frontend (404).
*
* Bypass host validation when: (1) tunnel proxy headers/query are present, or (2) the request host matches the
* tunnel store base URLs from provisioned state (browser opened admin URL directly without X-MageSail-Store-Code).
*
* @see TunnelRequestDetector::getTunnelStoreCode() for detection (includes hostname match via persisted state).
*/
class TunnelBackendFrontNameResolverPlugin
{
public function __construct(
private readonly RequestInterface $request,
private readonly TunnelRequestDetector $tunnelRequestDetector
) {
}
/**
* @param FrontNameResolver $subject
* @param callable(bool $checkHost=): string|false $proceed
* @return string|false
*/
public function aroundGetFrontName(FrontNameResolver $subject, callable $proceed, $checkHost = false)
{
$result = $proceed($checkHost);
if ($result !== false) {
return $result;
}
if (!$checkHost || !$this->request instanceof Http) {
return $result;
}
if ($this->tunnelRequestDetector->getTunnelStoreCode($this->request) === null) {
return $result;
}
if ($subject->isHostBackend()) {
return $result;
}
return $proceed(false);
}
}