2013-05-01 56 views
0

我想要的是能夠獲取特定站點的主機和子文件夾。例如: 從http://example:81/test/pagename.php獲得http://example:81/test/在PHP中解析主機+子目錄url

它也應該使用相同的網址http://example:81/test/和多個級別的子文件夾,如http://example:81/test/test2/somepage.php

它不應該得到文件夾本身內的文件結構,如http://example:81/test/images/page.php仍應該是http://example:81/test/而不是http://example:81/test/images/

我嘗試使用

$_SERVER['HTTP_HOST'] // only provides example:81 
$_SERVER['REQUEST_URI'] // provides full path example:81/test/images/ 

基本上我想要得到的是index.php文件的URL,即使它是在一個子文件夾。

有什麼辦法可以達到這個目的嗎?

+0

你可以嘗試這樣做,正則表達式,想不出什麼簡單 – piSHOCK 2013-05-01 22:20:47

+0

你怎麼能一個子域和一個簡單的子目錄,比如'images'之間的差異? 'parse_url'將允許你提取URL的所有部分,但它不知道它是一個子域還是一個簡單的目錄,這些函數在字符串上工作,就這些。 – MatRt 2013-05-01 22:24:18

+0

@MatRt子域位於域之前,子目錄位於/之後。例如'test.example.com/foo/bar.php','test'是主機'test.example.com'的子域部分,'/ foo /'是子目錄。 – 2013-05-01 22:27:14

回答

3

您可能需要構建自己的字符串才能獲取完整的網址。

<?php 
$url = 'http'.(isset($_SERVER['HTTPS'])?'s':'').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; 

如果你想要詳細信息,您可以用parse_url()

<?php 
$details = parse_url($url); 
print_r($details); 

將輸出類似:

Array 
(
    [scheme] => http 
    [host] => example.com 
    [port] => 81 
    [path] => /test/test2/ 
    [query] => somepage.php 
) 

編輯:

如果你想要的路徑到該文件,您可以使用$_SERVER['PHP_SCRIPT']獲取被調用腳本相對於文檔ro的文件名ot或$_SERVER['SCRIPT_FILENAME']以獲取包含文檔根目錄的服務器路徑。還有內置常量__DIR____FILE__,它們的服務器路徑直到當前腳本,即使包含在內。所有這些都可以與dirname()一起使用來獲取變量的目錄和basename()來獲取文件名。也有$_SERVER['DOCUMENT_ROOT']有路徑到web根目錄。

因此,如果腳本/var/www/test/index.php被調用,您可以使用dirname(__FILE__).'/some/sub/dir/',以便在該腳本所在的同一目錄下獲取路徑。

您可以通過執行print_r的$_SERVER來查看所有服務器變量,甚至可以調用phpinfo()來獲得所有已定義php模塊和變量的良好輸出。

+0

我想我的問題太具體了,無法完全回答(沒有發佈我的所有代碼)。儘管你的回答非常有幫助。有沒有更好的方法來表達第一個代碼示例,還是迄今爲止「最好」的方式?此外,$ _SERVER [HTTP_HOST]返回端口已經如此,如果我使用你的代碼,因爲它是我得到重複的端口,任何方式,或者我甚至需要擔心,因爲也許端口總是包含在http_host? – DominicM 2013-05-02 18:05:45

+0

@DominicM這是我知道的唯一方法。而且我在非標準端口上沒有服務器,所以我不知道端口是否包含在'HTTP_HOST'中。您可以刪除端口部分(我將編輯並刪除它)。如果您不需要在http/https之間切換,則也可以刪除https的支票。你可以在這裏看到其他的例子:http://stackoverflow.com/questions/6768793/php-get-the-full-url – 2013-05-02 21:39:22

0

我在一個項目中遇到過類似的問題;我希望能夠通過腳本文件名(例如index.php) 得到subfolder我嘗試了一些方法,但以下(醜)方法工作。 訣竅是「提供」所有.php文件可能存在的所有可能的「地方」的方法。

如果script name發現到這些地方之一,那麼subtract部分LEFT的 那些地方;這部分應該是subfolder(如果有的話)。

是的,它的醜陋但爲我工作...

$string = $_SERVER["SCRIPT_NAME"]; 
$subfolder = NULL; 
// tries to find the 'subfolder' by checking all possible PHP calls 
$places = array("/","plugins/","system/php"); 
foreach($places as $key=>$val) { 
    $pos = strpos($string,$val); 
    if ($pos !== FALSE && !isset($subfolder)) { 
    $subfolder = substr($string,0,$pos-1); 
    break; 
    } 
} 
+0

我最終簡單地從當前url減去數組中的鏈接名稱,然後附加它到最後如果它不是當前選擇的鏈接。 – DominicM 2013-05-02 18:08:30