Как создать абсолютный URL-путь к файлу скрипта? - PullRequest
5 голосов
/ 28 июня 2011

Это почти тот же вопрос, что и это

Мне нужно получить АБСОЛЮТНУЮ ссылку на мой скрипт.Например, у меня есть эта структура

http://mydomain.com/downloads/games/freegame_222/ajax.php

Мой корень приложения будет в freegame_222 /

, но как я могу "построить" абсолютный, а не относительный путь кajax.php?Результат будет

http://mydomain.com/downloads/games/freegame_222/ajax.php

или

/downloads/games/freegame_222/ajax.php

, но не:

ajax.php

Эти примеры вернутся после того, как url("ajax.php"); вызван

Есть ли для него встроенная функция в PHP?Если нет, кто-нибудь знает о каком-либо пользовательском?

РЕДАКТИРОВАТЬ:

Я хочу вызвать эту страницу с другой страницы, например index.php

Ответы [ 7 ]

7 голосов
/ 29 июня 2011

Аналогично ответу Джорджа Камминса, просто сделайте что-то вроде этого:

$path = $_SERVER['SERVER_NAME'] . '/' . $_SERVER['REQUEST_URI'];

Это должно дать вам полный путь. Теперь, если вы хотите получить это с другой страницы, по какой причине он генерирует URL-адрес динамически? Почему вы не можете просто использовать абсолютный путь, или вообще что-то, $_SERVER['SERVER_NAME'] + остаток пути, чтобы он работал между доменами / хостами.

3 голосов
/ 28 июня 2011
$url = "http" . ($_SERVER['HTTPS'] ? 's' : '') . "://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
2 голосов
/ 28 июня 2011

Эти данные содержатся в суперглобальном символе $ _SERVER

echo $_SERVER['REQUEST_URI']; // Output: /downloads/games/freegame_222/ajax.php

echo $_SERVER['SERVER_NAME']; // Output: mydomain.com
0 голосов
/ 31 августа 2018

Ниже функция может быть использована для получения правильного абсолютного URL.

function make_abs_url() {
    $path = $_SERVER['SERVER_NAME'] . '/' . $_SERVER['REQUEST_URI'];    

    $path_arr = explode("/", $path);

    $new_arr = array();

    for($i = 0; $i < count($path_arr); ++$i) {

        if(trim($path_arr[$i]) != "") {

            $new_arr[] = $path_arr[$i];

        }
    }

    $element = array_pop ( $new_arr);

    $abs_path = implode("/", $new_arr);

    if(substr($abs_path, 0, 4) != "http") {

        $abs_path = "http://" . $abs_path;
    } 

    return $abs_path;
}
0 голосов
/ 08 апреля 2014

Здесь была некоторая негибкость, которая помешала @genesis получить то, что ему нужно.

Поскольку мне в значительной степени «нужно» то же самое, вот мой (переформулированный) вопрос (и потенциальный ответ).

Допущения: приложение можно установить практически в любом месте, поскольку оно будет загружено кем-то из репозитория с открытым исходным кодом. Поэтому существует необходимость автоматического определения:

  1. Абсолютный путь к каталогу установки (например, /var/www/myserver/mysubdir/), который потребуется для включаемых файлов;
  2. Абсолютный URL для того же каталога, например, для навигации по меню и вызова файлов .php из любой точки приложения (например, http://myserver.tld/mysubdir/)
  3. Может быть неизвестный предел глубины для этих подкаталогов: например, в главном каталоге могут быть /css, /js, но также могут быть такие вещи, как /admin/plugins/js, которые, однако, могут потребовать получить config.php из верхнего каталога, чтобы узнать о таких вещах, как строки подключения к базе данных, глобальные параметры приложения и т. д.
  4. Приложение само может использовать несколько уровней; пользователь, устанавливающий приложение, может также сделать то же самое (например, /var/www/myserver - это место, на которое указывает виртуальный хост, но конечный пользователь хочет, чтобы приложение было ниже /var/www/myserver/yes/I/really/want/it/this/deep, и ожидает, что приложение будет полностью функциональным на http://myserver.tld/yes/I/really/want/it/this/deep

Я посмотрел, как это делает WordPress. По сути, WordPress требует , чтобы URL-адрес, указывающий на структуру каталогов, был жестко задан пользователем (другие приложения этого не делают). Затем он извлекает путь к каталогу (для включения файла) с помощью

if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/');

Это выглядит довольно аккуратно, но на самом деле проблема в том, что, если вы "глубоко" в иерархии каталогов, возможно, будет невозможно включить файл, который определяет ABSPATH . WordPress постоянно вызывает эти две строки и включает нужный файл конфигурации после того, как удостоверился, что он получил действительный ABSPATH .

Но другие программы, похоже, гораздо лучше организованы. Они автоматически извлекают правильный URL-адрес в каталог, на который указывает веб-сервер; и они даже более волшебным образом могут найти, где находятся все включаемые файлы, независимо от того, как глубоко в структуре подкаталогов они находятся.

Лучшее, что я мог сделать, - это эмулировать WordPress: «заставить» пользователя записать URL-адрес в файл конфигурации и на всех уровнях и подуровнях начать практически каждый файл с

if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/');

и попытаться включить файл глобальной конфигурации путем догадок (например, проверить, находится ли он на одном уровне, на один уровень вверх, на два уровня вверх и т. Д.).

Это очень грязно, но, похоже, именно это делают некоторые приложения золотого класса (например, WordPress). Другие кажутся намного более организованными. Как они это делают? Понятия не имею.

@ genesis, ты это имел в виду?

0 голосов
/ 12 июня 2013

Не имеет отношения к вопросу, однако стоит упомянуть, что HTTP / HTTPS может быть опущен в результате переадресации порта или обратного прокси. Вы можете сделать что-то подобное, чтобы преодолеть это:

function getBaseURL() {
    $isHttps = ((array_key_exists('HTTPS', $_SERVER) 
            && $_SERVER['HTTPS']) ||
        (array_key_exists('HTTP_X_FORWARDED_PROTO', $_SERVER) 
                && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
    );
    return 'http' . ($isHttps ? 's' : '') .'://' . $_SERVER['SERVER_NAME'];
}

Примечание : Это особенно полезно в Amazon EC2, развернутой под ELB с HTTPS.

0 голосов
/ 29 июня 2011

Функция parse_url () может сделать то, что вы ищете:

$url = 'http://mydomain.com/downloads/games/freegame_222/ajax.php';

$path = parse_url($url, PHP_URL_PATH);

Вот более полный пример из страницы руководства :

<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';

print_r(parse_url($url));

echo parse_url($url, PHP_URL_PATH);
?>

Приведенный выше пример выдаст:

Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)
/path
...