1<?php 2 3/** 4 * webtrees: online genealogy 5 * Copyright (C) 2023 webtrees development team 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <https://www.gnu.org/licenses/>. 16 */ 17 18declare(strict_types=1); 19 20namespace Fisharebest\Webtrees\Http\Middleware; 21 22use Fisharebest\Webtrees\Validator; 23use Psr\Http\Message\ResponseInterface; 24use Psr\Http\Message\ServerRequestInterface; 25use Psr\Http\Server\MiddlewareInterface; 26use Psr\Http\Server\RequestHandlerInterface; 27 28use function explode; 29use function parse_url; 30use function rtrim; 31 32use const PHP_URL_HOST; 33use const PHP_URL_PATH; 34use const PHP_URL_PORT; 35use const PHP_URL_SCHEME; 36 37/** 38 * Middleware to set the base URL. 39 */ 40class BaseUrl implements MiddlewareInterface 41{ 42 /** 43 * @param ServerRequestInterface $request 44 * @param RequestHandlerInterface $handler 45 * 46 * @return ResponseInterface 47 */ 48 public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface 49 { 50 // The request URL, as auto-detected from the environment. 51 $request_url = $request->getUri(); 52 53 // The base URL, as specified in the configuration file. 54 $base_url = Validator::attributes($request)->string('base_url', ''); 55 56 if ($base_url === '') { 57 // Not set in config.ini.php? Didn't read the upgrade instructions? 58 // We can guess the URL, provided we aren't using pretty URLs. 59 $base_url = rtrim(explode('index.php', (string) $request_url)[0], '/'); 60 $request = $request->withAttribute('base_url', $base_url); 61 $base_path = parse_url($base_url, PHP_URL_PATH) ?? ''; 62 $request_url = $request_url->withPath($base_path); 63 } else { 64 // Update the request URL from the base URL. 65 $base_scheme = parse_url($base_url, PHP_URL_SCHEME) ?? 'http'; 66 $base_host = parse_url($base_url, PHP_URL_HOST) ?? 'localhost'; 67 $base_port = parse_url($base_url, PHP_URL_PORT); 68 $request_url = $request_url->withScheme($base_scheme)->withHost($base_host)->withPort($base_port); 69 } 70 71 $request = $request->withUri($request_url); 72 73 return $handler->handle($request); 74 } 75} 76