2010-02-10 51 views
8

Tôi đang làm việc trên trang này: http://localhost/projectname/custom.phpBắt URL đầy đủ của trang hiện tại (PHP)

Cả <?php echo $_SERVER['REQUEST_URI']; ?><?php echo $PHP_SELF; ?> không đưa ra đầy đủ địa điểm. Tôi nên sử dụng thông tin gì để lấy vị trí url đầy đủ?

Trả lời

11
function selfURL() 
{ 
    $s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : ""; 
    $protocol = strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/").$s; 
    $port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]); 
    return $protocol."://".$_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI']; 
} 

function strleft($s1, $s2) { return substr($s1, 0, strpos($s1, $s2)); } 
+4

vẻ đến từ trang web đó: http://dev.kanngard.net/Permalinks/ID_20050507183447.html –

+3

'strleft' không tồn tại (ít nhất là trong gần đây các phiên bản của PHP). – pr1001

+0

pr1001 - strleft không được xây dựng trong chức năng trong php, nhưng chức năng usermade – user8455694

8

Không có một phương pháp tự nhiên như xa như tôi biết, nhưng bạn có thể sử dụng này:

function curPageURL() { 
$pageURL = 'http'; 
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";} 
$pageURL .= "://"; 
if ($_SERVER["SERVER_PORT"] != "80") { 
    $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; 
} else { 
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]; 
} 
return $pageURL; 
} 
+0

Nó có thể là tốt nếu bạn cũng kiểm tra '$ _SERVER [" SERVER_PROTOCOL "]' để biết giao thức. – PhoneixS

+0

@PhoneixS Giả sử đó là "HTTP/1.1" ... tôi phải làm gì với điều đó? – Michael

+0

@Michael bạn biết rằng giao thức là http để bạn có thể thêm http vào url. Trong câu trả lời này, bạn giả định rằng tất cả các yêu cầu là http nhưng có thể có các giao thức khác để phục vụ các tệp (ví dụ trong máy chủ apache với mod_ftp Tôi nghĩ rằng nó có thể là ftp). – PhoneixS

1

séc này ... dài một chút và dơ bẩn nhưng làm việc tốt ...

function absolutizeUrl ($u, $p) 
{ 
    $url = parse_url($u); 
    $page = parse_url($p); 

    if (strpos($u , '/') === 0) 
    { 
      //already absolute    
    } else { 
      $basePath = ''; 
      if (
        isset($page[ 'path' ]) 
        && strpos(ltrim($page[ 'path' ], '/'), '/') 
      ) 
      { 
        $baseTokens = explode('/', $page[ 'path' ]); 
        array_pop($baseTokens); // strip basename      
        $baseTokens[] = $u; 
        $u = join('/', $baseTokens); 
      } 
    } 
    if (! isset($url[ 'host' ])) 
    { 
      $u = 'http://'.$page[ 'host' ].'/'.ltrim($u, '/'); 
    } 
    return $u; 
    } 
2

Nếu bạn đang cố gắng thêm các biến trở lại vào cuối URL mà bạn đang đi qua một kịch bản theo dõi liên kết, ví dụ, bạn có thể thử này:

$URI = array(); 
foreach($_GET as $key=>$val) 
{ 
    if ($key!="link"&&$key!="id"&&$key!="type") $URI[] = "$key=".urlencode($val); 
} 
if (sizeof($URI)>0) $link.="&".join("&",$URI); 

Trong trường hợp này, "liên kết", "id" và "loại" là các biến tôi cần cho theo dõi, nhưng URL tôi muốn theo dõi có một biến ở cuối của nó đã bị xóa bởi kịch bản như thể nó là một phần của truy vấn được gửi đến nó; Tôi cần thêm nó trở lại URL liên kết trước khi chuyển nó tới tiêu đề ("Location:". $ Link).

Nếu đây là những gì bạn đang cố gắng để đạt được điều này hoạt động tuyệt vời và ngắn hơn ví dụ trên.

1

tôi tìm thấy mã này rất hữu ích

$protocol = strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === 
FALSE ? 'http' : 'https';   // Get protocol HTTP/HTTPS 
$host  = $_SERVER['HTTP_HOST']; // Get www.domain.com 
$script = $_SERVER['SCRIPT_NAME']; // Get folder/file.php 
$params = $_SERVER['QUERY_STRING'];// Get Parameters occupation=odesk&name=ashik 

$currentUrl = $protocol . '://' . $host . $script . '?' . $params; // Adding all 

echo $currentUrl; 
+1

chờ ... $ _SERVER ['SERVER_PROTOCOL'] == "HTTP/1.1" ngay cả khi sử dụng https! – Michael

Các vấn đề liên quan