В настоящее время я работаю над проектом PHP и ищу способ получить URL-адрес для корня веб-сайта; У меня есть файл конфигурации в корне, поэтому я думаю об использовании этого, чтобы выяснить «базовый URL». Я ищу способ сделать это динамически, чтобы я мог найти URL-адрес корня веб-сайта, то есть http://domain.com/my_app/
. Я стараюсь избегать использования относительных путей и использую PHP для генерации URL-адресов для того, что я использую. Например, я использую PHP для генерации CSS-кода и ссылки на CSS-код для изображений, поэтому я хотел бы получить абсолютный URL-адрес здесь вместо относительного пути.
my_app/ admin/ resources/ css/ admin-css.php imgs/ login.png resources/ css/ css.php imgs/ my-image.png shared-image.png config.php
В моем файле resources/css/css.php
я ищу получение «базового URL», чтобы я мог создать абсолютный URL-адрес в папке imgs
например http://img.ruphp.com/php/my-image.png
но в настоящее время я получаю http://img.ruphp.com/php/my-image.png
так как нижеприведенные определения смотрят на получение каталога загруженного PHP-файла, а не включенного. Я также хотел бы обмениваться изображениями между папками (т.е. получить доступ к файлу shared-image.png
из папки admin
), поэтому получение базового URL-адреса было бы идеальным в создании ссылок. Причина, по которой я избегаю относительных путей, заключается в том, что у меня есть функция, которая создает URL-адрес, createURL()
, поэтому я могу заставить все URL-адреса работать без необходимости жесткого кода.
<?php DEFINE('HTTP_TYPE', $_SERVER['HTTP_X_FORWARDED_PROTO']); DEFINE('HTTP_ROOT', $_SERVER['HTTP_HOST']); DEFINE('HTTP_FOLDER', dirname($_SERVER['PHP_SELF']) . '/'); DEFINE('BASE_URL', HTTP_TYPE . "://" . HTTP_ROOT . HTTP_FOLDER); function createURL($pathFromRoot) { return BASE_URL . $pathFromRoot; }
Все эти определения находятся в моем файле конфигурации, поэтому я думаю, что лучший способ сделать это – получить URL-адрес для файла конфигурации ( http://domain.com/my_app/config.php
) и просто удалить "config.php". Имейте в виду, что веб-сайт может размещаться глубже в структуре папок http://domain.com/my_app/another/folder/config.php
или без подпапок http://domain.com/config.php
.
Возможно ли это, если да, то как это можно сделать? Или мне нужен другой подход?
После выполнения var_dump
$_SERVER
и возиться, я обнаружил, что могу создать базовый URL с этим решением, если кто-то наткнется на этот вопрос. Я уверен, что есть другие способы, но это то, что сработало для меня.
<?php DEFINE('BASE_URL', HTTP_TYPE . "://" . HTTP_ROOT . substr(__DIR__, strlen($_SERVER[ 'DOCUMENT_ROOT' ])) . '/');
Мне просто нужно было то же самое, что я объединил ответы здесь и здесь, чтобы создать это решение, которое можно легко преобразовать в несколько констант и / или функцию. Я использую одну точку входа для своего веб-приложения (index.php) и имею конфигурацию в подпапке. Вы можете либо удалить известную папку, как показано в прокомментированной строке кода, либо запустить ее из основной папки. В качестве примера ваша структура может быть либо / или:
$urlDir = str_replace($docRoot, '', $dirRoot);
или
$urlDir = str_replace('/include', '/',str_replace($docRoot, '', $dirRoot));
Весь код:
$domain = $_SERVER['HTTP_HOST']; $docRoot = $_SERVER['DOCUMENT_ROOT']; $dirRoot = dirname(__FILE__); $protocol = isset($_SERVER["HTTPS"]) ? 'https://' : 'http://'; //$urlDir = str_replace('/include', '/',str_replace($docRoot, '', $dirRoot)); $urlDir = str_replace($docRoot, '', $dirRoot); $site_path = $protocol.$domain.$urlDir; define ('BASE_URL', $site_path);
На основе конфигурации сервера: вывод может не содержать конечную косую черту / если требуется, используйте любой из следующих:
$urlDir = str_replace('/include', '/',str_replace($docRoot, '/', $dirRoot));
$urlDir = str_replace($docRoot, '/', $dirRoot);
BTW, функция кажется ненужной, например:
function createURL($pathFromRoot) { return BASE_URL . $pathFromRoot; } //Anywhere you can call `createURL($value)` makes the following true $isTrue = createURL('/static/js/my.js') === BASE_URL.'/static/js/my.js'; $someNeededURL = '/static/whatever/is/converted/'; $alsoTrue = createURL($someNeededURL) === BASE_URL.$someNeededURL; //and just for fun if ($isTrue.$alsoTrue === 11){ echo 'Not eleven'; } else { echo $isTrue.$alsoTrue.'!==11'; };