2013-11-01 47 views
4

我目前正在開發一個PHP項目,並正在尋找一種獲取網站根目錄URL的方法;我在根目錄下有一個配置文件,因此我正在考慮使用它來找出「基本URL」。我正在尋找一種動態的方式,因此我可以找到網站根目錄的URL,即http://domain.com/my_app/。我盡我所能避免使用相對路徑,並使用PHP爲我所使用的任何內容生成URL。例如,我使用PHP來生成CSS代碼和圖像的CSS代碼鏈接,所以我想在這裏獲取絕對URL而不是相對路徑。獲取PHP網站的根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://domain.com/resources/imgs/my-image.png,但目前我在獲得目錄獲得,因爲下面的樣子定義http://domain.com/resources/css/imgs/my-image.png加載的PHP文件,而不是包含的文件。我還希望在文件夾之間共享圖像(即訪問admin文件夾中的shared-image.png文件),以便獲取基本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更深的託管。

這是可能的,如果是這樣怎麼辦?或者我應該遵循另一種方法?

+0

在客戶端的URL,或者在服務器側的路徑? (另請注意,'HTTP_X_FORWARDED_PROTO'僅在客戶端發送了'X-Forwarded-Proto'頭部時纔會設置,但並非總是如此。) – zneak

+0

不清楚,您在'resources/css'中並希望獲得'my_app /'或者你在我的應用程序中,包括'resources/css'中的文件並獲取它? – lampwins

+0

難道你不能只解析你想要的URL的一部分?你拿你當前的BASE_URL,只是分裂它錯了? –

回答

6

在做了var_dump$_SERVER和搞亂我發現我可以用這個解決方案生成基本URL,以防有人在這個問題上絆倒。我確信還有其他方法,但這對我來說很有用。

<?php 
DEFINE('BASE_URL', HTTP_TYPE . "://" . HTTP_ROOT . substr(__DIR__, strlen($_SERVER[ 'DOCUMENT_ROOT' ])) . '/'); 
2

我只需要我結合從herehere答案創建這個溶液可以很容易地轉換爲多個常量和/或功能的相同的事情。 我爲我的web應用程序(index.php)使用一個入口點,並將我的配置存放在一個子文件夾中。 您可以按照已註釋的代碼行中所示去除已知文件夾,也可以從主文件夾運行該文件夾。作爲例子您的結構可能是要麼/或:

  • /public/html/some/random/folders/THEAPP/config.php
    • $urlDir = str_replace($docRoot, '', $dirRoot);

  • /public/html/some/random/folders/THEAPP/include/config。PHP
    • $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);

順便說一句,該功能似乎不必要的,因爲例如:

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'; 
    };