รับ URL แบบเต็มใน PHP


977

ฉันใช้รหัสนี้เพื่อรับ URL แบบเต็ม:

$actual_link = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

ปัญหาคือฉันใช้มาสก์บางตัวในตัวฉัน.htaccessดังนั้นสิ่งที่เราเห็นใน URL ไม่ได้เป็นเส้นทางที่แท้จริงของไฟล์เสมอไป

สิ่งที่ฉันต้องการคือการได้รับ URL สิ่งที่เขียนใน URL ไม่มีอะไรมากไปกว่า URL ทั้งหมด

ฉันต้องการทราบวิธีการที่ปรากฏในแถบนำทางในเว็บเบราว์เซอร์ไม่ใช่เส้นทางที่แท้จริงของไฟล์บนเซิร์ฟเวอร์


24
@Brade URL bar อยู่ในเบราว์เซอร์ผู้ใช้ดังนั้นทำไม PHP จึงมีฟังก์ชันการทำงานใด ๆ PHP เป็นฝั่งเซิร์ฟเวอร์
eis

33
@ eis เชื่อฉันมีเหตุผลมากมายที่ต้องการสิ่งนี้ หน้าที่เชื่อมโยงไปถึงที่ใช้เทมเพลตเดียวกัน แต่จำเป็นต้องมีการติดตามแยกต่างหาก ฯลฯ และความจริงก็คือ PHP (หรือฝั่งเซิร์ฟเวอร์ใด ๆ ) สามารถส่งคืนส่วนต่าง ๆ ทั้งหมดของ URL แต่ดูเหมือนจะไม่ให้สิ่งทั้งหมดในสตริงเดียว . ดูเหมือนว่าจะโง่
Brade

12
สิ่งทั้งหมดไม่เคยถูกส่งไปยังฝั่งเซิร์ฟเวอร์เพราะมันไม่สำคัญซึ่งเป็นเหตุผลว่าทำไมมันไม่พร้อมใช้งานได้ทุกที่ ฉันจะคำนึงถึงการใช้งานใด ๆ แต่นั่นเป็นเพียงความคิดเห็นของฉัน
eis

5
ตัวอย่างข้างต้นสำหรับความต้องการ URL ของตนเอง: "การกรอก URL การกระทำของ FORM" อาจผิดเนื่องจาก PHP_SELF (เส้นทางเท่านั้นโดเมน sans เป็นต้น) ควรเพียงพอสำหรับสิ่งนั้น แต่ก็ไม่ได้หมายความว่าทุกความต้องการอื่น ๆ สำหรับ URL ของตัวเองที่ยอมรับนั้นไม่ถูกต้อง หากพวกเขาเป็นจริงมันจะน่ากลัวที่จะเห็นคำอธิบายอย่างละเอียดว่าทำไม
Sz.

4
หนึ่งในเหตุผลที่คุณไม่ควร hardcode URL ของคุณในการกำหนดค่าคือเมื่อคุณมีแพลตฟอร์มที่แตกต่างกันซึ่งโครงการของคุณจะถูกติดตั้งบน (dev, Integration, production) หนึ่งในนั้นแต่ละคนจะมี URL เฉพาะและคุณไม่ต้องการเปลี่ยนรหัสของคุณตามเซิร์ฟเวอร์ที่โครงการของคุณติดตั้งอยู่
Guillaume Fache

คำตอบ:


2050

ลองดู$_SERVER['REQUEST_URI']คือ

$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

(โปรดทราบว่าไวยากรณ์สตริงที่ยกมาสองครั้งถูกต้องสมบูรณ์ )

หากคุณต้องการสนับสนุนทั้ง HTTP และ HTTPS คุณสามารถใช้

$actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

หมายเหตุบรรณาธิการ:ใช้รหัสนี้มีผลกระทบต่อการรักษาความปลอดภัย ไคลเอ็นต์สามารถตั้งค่า HTTP_HOST และ REQUEST_URI เป็นค่าใดก็ได้ที่ต้องการ


134
ถ้าคุณใช้ลิงค์ https ล่ะ? จะเกิดอะไรขึ้นถ้า HTTP_HOST ไม่พร้อมใช้งานหรือถูกแก้ไขโดยฝั่งไคลเอ็นต์ คำตอบนี้ดูเหมือนว่าไม่สมบูรณ์และไม่น่าเชื่อถือ
Manachi

21
ไม่มากที่คุณสามารถทำได้นี่เป็นวิธีการที่เหมาะสมสำหรับคำถามที่ถาม
Mfoo

183
คุณสามารถเพิ่มเช็ค HTTPS:'http' . (isset($_SERVER['HTTPS']) ? 's' : '') . '://' . "{$_SERVER['HTTP_HOST']}/{$_SERVER['REQUEST_URI']}"
ivkremer

7
หากคุณกำลังส่ง URL ไปยังเบราว์เซอร์เป็นลิงก์ให้ปล่อย http: off ดู: stackoverflow.com/questions/4978235
GameCharmer

5
@ขวาน. และคุณคิดว่าคุณมีมากกว่าฉันเล็กน้อย เพื่อนตกลง หากความเย่อหยิ่งของคุณไม่แสดงผลอย่างมากพอจากการที่คุณใช้เครื่องมือผู้ดูแลในทางที่ผิดในการย้อนกลับคำตอบของคุณแสดงว่ามันเพียงพอแล้วที่นี่ ดังนั้นทำให้เสียชื่อเสียงทุกอย่างอื่นที่คุณต้องพูด นอกจากนี้ฉันไม่ได้เข้าใจผิดอะไร (คุณรู้ว่าสิ่งที่พวกเขาพูดเกี่ยวกับการสันนิษฐาน ... ) ฉันรู้ว่าสิ่งที่คุณกำลังทำและมันไม่ใช่การปฏิบัติที่ดี
ใช่แบร์รี่

416

ลิงก์สั้น ๆ สำหรับลิงก์ออกบนหน้าเว็บ

$url =  "//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";

$escaped_url = htmlspecialchars( $url, ENT_QUOTES, 'UTF-8' );
echo '<a href="' . $escaped_url . '">' . $escaped_url . '</a>';

ต่อไปนี้เป็นรายละเอียดเพิ่มเติมเกี่ยวกับปัญหาและตัวพิมพ์ขอบของรูปแบบ //example.com/path/

เวอร์ชันเต็ม

function url_origin( $s, $use_forwarded_host = false )
{
    $ssl      = ( ! empty( $s['HTTPS'] ) && $s['HTTPS'] == 'on' );
    $sp       = strtolower( $s['SERVER_PROTOCOL'] );
    $protocol = substr( $sp, 0, strpos( $sp, '/' ) ) . ( ( $ssl ) ? 's' : '' );
    $port     = $s['SERVER_PORT'];
    $port     = ( ( ! $ssl && $port=='80' ) || ( $ssl && $port=='443' ) ) ? '' : ':'.$port;
    $host     = ( $use_forwarded_host && isset( $s['HTTP_X_FORWARDED_HOST'] ) ) ? $s['HTTP_X_FORWARDED_HOST'] : ( isset( $s['HTTP_HOST'] ) ? $s['HTTP_HOST'] : null );
    $host     = isset( $host ) ? $host : $s['SERVER_NAME'] . $port;
    return $protocol . '://' . $host;
}

function full_url( $s, $use_forwarded_host = false )
{
    return url_origin( $s, $use_forwarded_host ) . $s['REQUEST_URI'];
}

$absolute_url = full_url( $_SERVER );
echo $absolute_url;

http://snipplr.com/view.php?codeview&id=2734นี้เป็นรุ่นที่มีการปรับเปลี่ยนอย่างหนัก

โครงสร้าง URL:

แบบแผน: // ชื่อผู้ใช้: รหัสผ่าน @domain: พอร์ต / เส้นทาง? query_string # fragment_id

ส่วนที่เป็นตัวหนาจะไม่รวมอยู่ในฟังก์ชั่น

หมายเหตุ:

  • ฟังก์ชั่นนี้ไม่รวมusername:passwordจาก URL แบบเต็มหรือส่วน (แฮ)
  • จะไม่แสดงพอร์ตเริ่มต้น 80 สำหรับ HTTP และพอร์ต 443 สำหรับ HTTPS
  • ทดสอบด้วย http และรูปแบบ https เท่านั้น
  • #fragment_idจะไม่ถูกส่งไปยังเซิร์ฟเวอร์โดยลูกค้า (เบราว์เซอร์) และจะไม่ถูกเพิ่มไปยัง URL แบบเต็ม
  • $_GETเพียง แต่จะมีfoo=bar2URL /example?foo=bar1&foo=bar2ที่เหมือน
  • CMS และสภาพแวดล้อมบางอย่างจะเขียนใหม่$_SERVER['REQUEST_URI']และคืน/example?foo=bar2ค่า URL เช่น/example?foo=bar1&foo=bar2ใช้$_SERVER['QUERY_STRING']ในกรณีนี้
  • โปรดทราบว่าURI = URL + URNแต่เนื่องจากการใช้งานที่ได้รับความนิยมตอนนี้ URL หมายถึงทั้ง URI และ URL
  • คุณควรลบHTTP_X_FORWARDED_HOSTหากคุณไม่ได้วางแผนที่จะใช้พร็อกซีหรือบาลานเซอร์
  • สเป็คบอกว่าHostส่วนหัวจะต้องมีหมายเลขพอร์ตเว้นแต่เป็นหมายเลขเริ่มต้น

ตัวแปรควบคุมไคลเอ็นต์ (เบราว์เซอร์):

  • $_SERVER['REQUEST_URI']. อักขระที่ไม่สนับสนุนจะถูกเข้ารหัสโดยเบราว์เซอร์ก่อนที่จะถูกส่ง
  • $_SERVER['HTTP_HOST']และไม่สามารถใช้งานได้ตามความคิดเห็นในคู่มือ PHP เสมอ: http://php.net/manual/en/reserved.variables.php
  • $_SERVER['HTTP_X_FORWARDED_HOST']ได้รับการตั้งค่าโดย balancers และไม่ได้กล่าวถึงในรายการของ$_SERVERตัวแปรในคู่มือ PHP

ตัวแปรที่ควบคุมโดยเซิร์ฟเวอร์:

  • $_SERVER['HTTPS']. ลูกค้าเลือกที่จะใช้สิ่งนี้ แต่เซิร์ฟเวอร์จะคืนค่าที่แท้จริงเป็นค่าว่างหรือ "เปิด"
  • $_SERVER['SERVER_PORT']. เซิร์ฟเวอร์ยอมรับเฉพาะหมายเลขที่อนุญาตเป็นพอร์ต
  • $_SERVER['SERVER_PROTOCOL']. เซิร์ฟเวอร์ยอมรับโปรโตคอลที่แน่นอนเท่านั้น
  • $_SERVER['SERVER_NAME']. มันถูกตั้งค่าด้วยตนเองในการกำหนดค่าเซิร์ฟเวอร์และไม่สามารถใช้ได้สำหรับ IPv6 ตามkralyk

ที่เกี่ยวข้อง:

HTTP_HOST กับ SERVER_NAME
จำเป็นต้องมีหมายเลขพอร์ตในพารามิเตอร์ส่วนหัว HTTP "โฮสต์" หรือไม่
https://stackoverflow.com/a/28049503/175071


14
รหัสนี้จะล้มเหลวหากเซิร์ฟเวอร์ได้รับที่อยู่ IPv6 IP หากต้องการแก้ไขให้แทนที่ SERVER_NAME ด้วย HTTP_HOST
kralyk

1
หมายเหตุ: $_SERVER['REQUEST_URI']จะแสดง/example?foo=bar2URL เช่น/example?foo=bar1&foo=bar2
Timo Huovinen

2
สิ่งนี้จะไม่มีสิ่งที่กำหนดไว้หลังจาก # สิ่งเหล่านั้นจะไม่ถูกส่งผ่านไปยังเซิร์ฟเวอร์
William King

1
ฉันไม่แน่ใจว่าปลอดภัยหรือไม่ ในตัวอย่างของคุณคุณสามารถส่งส่วนหัวของโฮสต์ไปถึงหน้าที่ถูกต้อง แต่อาจทำให้หน้าคิดว่ามันถูกเรียกผ่านโฮสต์อื่นโดยใช้ส่วนหัว HTTP_X_FORWARDED_HOST เมื่อแอปพลิเคชันใช้ข้อมูลนี้ (เพื่ออะไรก็ตาม) มันอาจเป็นปัญหาด้านความปลอดภัยได้อย่างแน่นอนเนื่องจากจะช่วยให้คุณสามารถสัญญาบางสิ่งได้
hek2mgl

1
@ Matt3o12 มูลค่าของพอร์ตที่ถูกนำมาโดยตรงจากHostส่วนหัวยังไม่ได้เห็นมันติดตั้งเช่นนั้นขอบคุณสำหรับการกล่าวขวัญว่าจะเพิ่มเป็นบิด
Timo Huovinen

226

ตัวอย่างสำหรับ: https://(www.)example.com/subFolder/myfile.php?var=blabla#555

// ======= PATHINFO ====== //
$x = pathinfo($url);
$x['dirname']      🡺 https://example.com/subFolder
$x['basename']     🡺                               myfile.php?var=blabla#555 // Unsecure! 
$x['extension']    🡺                                      php?var=blabla#555 // Unsecure! 
$x['filename']     🡺                               myfile

// ======= PARSE_URL ====== //
$x = parse_url($url);
$x['scheme']       🡺 https
$x['host']         🡺         example.com
$x['path']         🡺                    /subFolder/myfile.php
$x['query']        🡺                                          var=blabla
$x['fragment']     🡺                                                     555

//=================================================== //
//========== self-defined SERVER variables ========== //
//=================================================== //
$_SERVER["DOCUMENT_ROOT"]  🡺 /home/user/public_html
$_SERVER["SERVER_ADDR"]    🡺 143.34.112.23
$_SERVER["SERVER_PORT"]    🡺 80(or 443 etc..)
$_SERVER["REQUEST_SCHEME"] 🡺 https                                         //similar: $_SERVER["SERVER_PROTOCOL"] 
$_SERVER['HTTP_HOST']      🡺         example.com (or with WWW)             //similar: $_SERVER["ERVER_NAME"]
$_SERVER["REQUEST_URI"]    🡺                       /subFolder/myfile.php?var=blabla
$_SERVER["QUERY_STRING"]   🡺                                             var=blabla
__FILE__                   🡺 /home/user/public_html/subFolder/myfile.php
__DIR__                    🡺 /home/user/public_html/subFolder              //same: dirname(__FILE__)
$_SERVER["REQUEST_URI"]    🡺                       /subFolder/myfile.php?var=blabla
parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)🡺  /subFolder/myfile.php 
$_SERVER["PHP_SELF"]       🡺                       /subFolder/myfile.php

// ==================================================================//
//if "myfile.php" is included in "PARENTFILE.php" , and you visit  "PARENTFILE.PHP?abc":
$_SERVER["SCRIPT_FILENAME"]🡺 /home/user/public_html/parentfile.php
$_SERVER["PHP_SELF"]       🡺                       /parentfile.php
$_SERVER["REQUEST_URI"]    🡺                       /parentfile.php?var=blabla
__FILE__                   🡺 /home/user/public_html/subFolder/myfile.php

// =================================================== //
// ================= handy variables ================= //
// =================================================== //
//If site uses HTTPS:
$HTTP_or_HTTPS = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS']!=='off') || $_SERVER['SERVER_PORT']==443) ? 'https://':'http://' );            //in some cases, you need to add this condition too: if ('https'==$_SERVER['HTTP_X_FORWARDED_PROTO'])  ...

//To trim values to filename, i.e. 
basename($url)             🡺 myfile.php

//excellent solution to find origin
$debug_files = debug_backtrace();       
$caller_file = count($debug_files) ? $debug_files[count($debug_files) - 1]['file'] : __FILE__;

แจ้งให้ทราบ! ! !

  • #ส่วนแฮชแท็กถูกใช้ด้วยตนเองในตัวอย่างด้านบนเพื่อวัตถุประสงค์ในการแสดงภาพประกอบอย่างไรก็ตามภาษาฝั่งเซิร์ฟเวอร์ (รวมถึงphp) ไม่สามารถตรวจพบพวกมันได้อย่างแท้จริง (เฉพาะจาวาสคริปต์เท่านั้นที่สามารถทำได้เนื่องจากแฮชแท็กเป็นเพียงการbrowser/client sideทำงาน)
  • DIRECTORY_SEPARATORผลตอบแทน\สำหรับ Windows /ประเภทโฮสติ้งแทน



สำหรับ WordPress

//(let's say, if wordpress is installed in subdirectory:  http://example.com/wpdir/)
home_url()                      🡺 http://example.com/wpdir/        //if is_ssl() is true, then it will be "https"
get_stylesheet_directory_uri()  🡺 http://example.com/wpdir/wp-content/themes/THEME_NAME  [same: get_bloginfo('template_url') ]
get_stylesheet_directory()      🡺 /home/user/public_html/wpdir/wp-content/themes/THEME_NAME
plugin_dir_url(__FILE__)        🡺 http://example.com/wpdir/wp-content/themes/PLUGIN_NAME
plugin_dir_path(__FILE__)       🡺 /home/user/public_html/wpdir/wp-content/plugins/PLUGIN_NAME/  

ส่วนที่ # อยู่ที่ไหนไม่มีวิธีที่เราสามารถเข้าถึงส่วนหลัง # ในฝั่งเซิร์ฟเวอร์?
Rohit Khatri

@RohitKhatri ส่วนนั้นสามารถเข้าถึงได้เฉพาะในเบราว์เซอร์และไม่ได้ส่งไปยังเซิร์ฟเวอร์
beppe9000

ฟังก์ชั่น wordpress คืออะไรที่จะได้รับ url ที่มีสตริงการสืบค้นด้วย?
beppe9000

64

นี่คือวิธีการแก้ปัญหาโดยใช้คำสั่งที่ประกอบไปด้วยทำให้รหัสน้อยที่สุด:

$url = "http" . (($_SERVER['SERVER_PORT'] == 443) ? "s" : "") . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

วิธีนี้เป็นวิธีที่เล็กที่สุดและง่ายที่สุดในการทำเช่นนี้สมมติว่าเว็บเซิร์ฟเวอร์หนึ่งคือการใช้พอร์ตมาตรฐาน 443 สำหรับHTTPS


18
หรือใช้$_SERVER["HTTPS"] == "on"เพื่อตรวจสอบว่า SSL เปิดอยู่หรือไม่
Dzhuneyt

15
คุณควรใช้ $ _SERVER ["HTTPS"] เนื่องจากพอร์ต 443 เป็นเพียงพอร์ต SSL เริ่มต้นไม่ใช่ตัวบ่งชี้ SSL
Alex Barker

4
@AlexBarker - นั่นเป็นเหตุผลที่ฉันพูดว่า "สมมติว่ามีเว็บเซิร์ฟเวอร์ตัวหนึ่งกำลังใช้พอร์ตมาตรฐาน 443 สำหรับ HTTPS"
honyovk

44

วิธีการข้ามแพลตฟอร์มที่ฉันโปรดปรานสำหรับการค้นหา URL ปัจจุบันคือ:

$url = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

7
ปิด แต่ฉันต้องเปลี่ยนเป็น: $ url = ((ผู้ออก ($ _ SERVER ['HTTPS'])) && $ _SERVER ['HTTPS']! == 'ปิด')? "https": "http") . ": // $ _ SERVER [HTTP_HOST] $ _SERVER [REQUEST_URI]";
Erik Allen

34

เพียงใช้:

$uri = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']

1
เท่าที่ฉันต้องการใช้สิ่งนี้มันไม่ทำงานใน IIS stackoverflow.com/questions/18008135/…
Erik Allen

มันส่งออกอะไร
HappyCoder

5
ประกาศ PHP: ดัชนีที่ไม่ได้กำหนด: REQUEST_SCHEME
Erik Allen

ฉันชอบวิธีนี้! แต่คุณสามารถทำให้มันใช้งานได้กับ nginx ด้วยหรือไม่
cowboysaif

1
http://example.com :8080 /request.phpและล้มเหลว คำตอบเหล่านี้มีความซับซ้อนด้วยเหตุผล
David Refoua

21
function full_path()
{
    $s = &$_SERVER;
    $ssl = (!empty($s['HTTPS']) && $s['HTTPS'] == 'on') ? true:false;
    $sp = strtolower($s['SERVER_PROTOCOL']);
    $protocol = substr($sp, 0, strpos($sp, '/')) . (($ssl) ? 's' : '');
    $port = $s['SERVER_PORT'];
    $port = ((!$ssl && $port=='80') || ($ssl && $port=='443')) ? '' : ':'.$port;
    $host = isset($s['HTTP_X_FORWARDED_HOST']) ? $s['HTTP_X_FORWARDED_HOST'] : (isset($s['HTTP_HOST']) ? $s['HTTP_HOST'] : null);
    $host = isset($host) ? $host : $s['SERVER_NAME'] . $port;
    $uri = $protocol . '://' . $host . $s['REQUEST_URI'];
    $segments = explode('?', $uri, 2);
    $url = $segments[0];
    return $url;
}

หมายเหตุ: ฉันเพิ่งอัปเดตรหัสของ Timo Huovinenดังนั้นคุณจะไม่ได้รับพารามิเตอร์ GET ใด ๆ ใน URL URL นี้เป็นแบบธรรมดาและลบสิ่งต่าง ๆ เช่น?hi=i&am=a&getนี้เป็นธรรมดาและขจัดสิ่งที่ต้องการ

ตัวอย่าง:

http://www.example.com/index?get=information

จะแสดงเป็น:

http://www.example.com/index

สิ่งนี้ดีถ้าคุณใช้พารามิเตอร์ของ GET เพื่อกำหนดเนื้อหาบางอย่างซึ่งในกรณีนี้คุณควรใช้รหัสของเขา! :-)


เฮ้มันเจ๋งสุด ๆ :) คุณสามารถลบอะไรก็ได้หลังจากแฮช "#" (ส่วนของ url) ในกรณีที่มันลื่น
ไหล

ไม่ใช่เพราะถ้าคุณตั้งใน "explode ('#', $ segment [0])" มันจะนับว่าเป็นข้อผิดพลาดเนื่องจากสัญลักษณ์ "#" แบ่ง URL และสามารถอ่านได้โดย Javascript เท่านั้น แต่สิ่งที่คุณสามารถทำได้เพื่อให้แน่ใจคือคุณสามารถสร้าง "return $ url;" ด้วย "return trim ($ url, '#');" เพราะคุณจะลบมันในกรณีที่มันจะอยู่ที่นั่น . แต่จะไม่ลบเนื้อหาต่อไปนี้ คุณสามารถอ่านได้ที่ "Parse_url" หากคุณต้องการ :-)
Alex Westergaard

17

ล้างรหัสทำงานกับ webservers ทั้งหมด (Apache, nginx, IIS, ... ):

$url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

11

นี่คือวิธีการแก้ปัญหาของฉัน - รหัสแรงบันดาลใจจากเทรซี่ดีบักเกอร์ มีการเปลี่ยนแปลงเพื่อรองรับพอร์ตเซิร์ฟเวอร์ที่แตกต่างกัน คุณสามารถรับ URL ปัจจุบันแบบเต็มรวมถึง$_SERVER['REQUEST_URI']หรือเพียงแค่ URL เซิร์ฟเวอร์พื้นฐาน ตรวจสอบฟังก์ชั่นของฉัน:

function getCurrentUrl($full = true) {
    if (isset($_SERVER['REQUEST_URI'])) {
        $parse = parse_url(
            (isset($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'off') ? 'https://' : 'http://') .
            (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '')) . (($full) ? $_SERVER['REQUEST_URI'] : null)
        );
        $parse['port'] = $_SERVER["SERVER_PORT"]; // Setup protocol for sure (80 is default)
        return http_build_url('', $parse);
    }
}

นี่คือรหัสทดสอบ:

// Follow $_SERVER variables was set only for test
$_SERVER['HTTPS'] = 'off'; // on
$_SERVER['SERVER_PORT'] = '9999'; // Setup
$_SERVER['HTTP_HOST'] = 'some.crazy.server.5.name:8088'; // Port is optional there
$_SERVER['REQUEST_URI'] = '/150/tail/single/normal?get=param';

echo getCurrentUrl();
// http://some.crazy.server.5.name:9999/150/tail/single/normal?get=param

echo getCurrentUrl(false);
// http://some.crazy.server.5.name:9999/

ประกาศ: http_build_urlต้องติดตั้ง pecl_http
Mauran Muthiah

11

HTTP_HOST และ REQUEST_URI จะต้องอยู่ในเครื่องหมายคำพูดมิฉะนั้นจะเกิดข้อผิดพลาดใน PHP 7.2

ใช้:

$actual_link = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

หากคุณต้องการสนับสนุนทั้ง HTTP และ HTTPS:

$actual_link = (isset($_SERVER['HTTPS']) ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

9

เทคนิคเดียวกับคำตอบที่ยอมรับ แต่รองรับHTTPSและสามารถอ่านได้มากขึ้น:

$current_url = sprintf(
    '%s://%s/%s',
    isset($_SERVER['HTTPS']) ? 'https' : 'http',
    $_SERVER['HTTP_HOST'],
    $_SERVER['REQUEST_URI']
);

9

ฉันได้ทำฟังก์ชั่นนี้เพื่อจัดการ URL:

 <?php
     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;
     }
 ?>

7

ใช้หนึ่งซับในเพื่อค้นหา URL ของโฟลเดอร์พาเรนต์ (หากคุณไม่มีสิทธิ์เข้าถึง http_build_url () ที่มาพร้อมกับ pecl_http):

$url = (isset($_SERVER['HTTPS']) ? 'https://' : 'http://').$_SERVER['SERVER_NAME'].str_replace($_SERVER['DOCUMENT_ROOT'], '', dirname(dirname(__FILE__)));

5
คุณผสม url และไฟล์ตำแหน่งที่แน่นอนบนดิสก์
sd1sd1

6

นี่เป็นเรื่องง่ายที่จะทำกับตัวแปรสภาพแวดล้อม Apache ของคุณ ใช้งานได้กับ Apache 2 เท่านั้นซึ่งฉันคิดว่าคุณใช้อยู่

เพียงใช้รหัส PHP ต่อไปนี้:

<?php
    $request_url = apache_getenv("HTTP_HOST") . apache_getenv("REQUEST_URI");
    echo $request_url;
?>

6

ลองสิ่งนี้:

print_r($_SERVER);

$_SERVERคืออาร์เรย์ที่มีข้อมูลเช่นส่วนหัวเส้นทางและตำแหน่งสคริปต์ รายการในอาร์เรย์นี้สร้างขึ้นโดยเว็บเซิร์ฟเวอร์ ไม่มีการรับประกันว่าทุกเว็บเซิร์ฟเวอร์จะให้สิ่งเหล่านี้; เซิร์ฟเวอร์อาจละเว้นบางเซิร์ฟเวอร์หรือให้บริการอื่น ๆ ที่ไม่อยู่ในรายการนี้ ดังที่กล่าวไว้ว่าตัวแปรเหล่านี้มีอยู่เป็นจำนวนมากในสเปค» CGI / 1.1 ดังนั้นคุณควรคาดหวังได้

$HTTP_SERVER_VARSมีข้อมูลเริ่มต้นเหมือนกัน แต่ไม่ใช่ superglobal (โปรดทราบว่า$HTTP_SERVER_VARSและ$_SERVERเป็นตัวแปรที่แตกต่างกันและ PHP จัดการกับสิ่งเหล่านี้)


6

คุณสามารถใช้http_build_urlโดยไม่มีอาร์กิวเมนต์เพื่อรับURLแบบเต็มของหน้าปัจจุบัน:

$url = http_build_url();

5
โปรดทราบว่า http_build_url () เป็นฟังก์ชัน PECL เท่านั้น: (PECL pecl_http> = 0.21.0)
Volomike

5

ฉันทำคลาสนี้เพื่อจัดการ URI ของฉัน

<?php
/** -------------------------------------------------------------------------------------------------------------------
 * URI CLASS
 * URI management class
 *
 * @author Sandu Liviu Catalin
 * @email slc(dot)universe(at)gmail(dot)com
 * @license Public Domain
**/
abstract class _URI
{
    /** ---------------------------------------------------------------------------------------------------------------
     *  - BASE PARAMETERS
     * $_Script_Hidden - Hide the script name from the returned URI
     * $_Public_Path - Location where public resources are stored
     * $_Public_Relative - Return the relative path version of public location
     * $_Public_Skin - Is the skin directory located in the public directory
     * $_Skin_Path - Location where skins are stored
     * $_Skin_Relative - Return the relative path version of skin location
     * $_Skin_Default - Use this as the default system skin
     * $_Fallback_Base - Use this base URL if you can't extract the current URL
     * $_Fallback_Scheme - Use this scheme if you can't find it automatically
     * $_Fallback_User - Use this user name if you can't find it automatically
     * $_Fallback_Passwd - Use this password if you can't find it automatically
     * $_Fallback_Host - Use this host if you can't find it automatically
     * $_Fallback_Port - Use this port number if you can't find it automatically
     * $_Fallback_Script - Use this script name if you can't find it automatically
     * $_Separator_Scheme - Use this to separate the scheme from the rest of the url
     * $_Separator_Credentials - Use this to separate the user name from the password
     * $_Separator_Auth - Use this to separate the user name and password from host
     * $_Separator_Port - Use this to separate the port number from host
     * $_Separator_Query - Use this to separate the query data from base URL
     * $_Separator_Fragment - Use this to separate the fragment data from query data
    */
    protected static $_Script_Hidden;
    protected static $_Public_Path;
    protected static $_Public_Relative;
    protected static $_Public_Skin;
    protected static $_Skin_Path;
    protected static $_Skin_Relative;
    protected static $_Skin_Default;
    protected static $_Fallback_Base;
    protected static $_Fallback_Scheme;
    protected static $_Fallback_User;
    protected static $_Fallback_Passwd;
    protected static $_Fallback_Host;
    protected static $_Fallback_Port;
    protected static $_Fallback_Script;
    protected static $_Separator_Scheme;
    protected static $_Separator_Credentials;
    protected static $_Separator_Auth;
    protected static $_Separator_Port;
    protected static $_Separator_Query;
    protected static $_Separator_Fragment;

    /** ----------------------------------------------------------------------------------------------------------------
     * CACHED BASES
     * Precompiled common URLs for quick retrieval
    */
    protected static $Base_Host;
    protected static $Base_App;
    protected static $Base_Script;
    protected static $Base_Current;
    protected static $Base_Public;
    protected static $Base_Skin;

    /** ----------------------------------------------------------------------------------------------------------------
     * DATA CONTAINERS
     * Raw URI segments saved from extracted data
    */
    protected static $__Segments = array(
        'SCHEME' => '',
        'USER' => '',
        'PASSWD' => '',
        'HOST' => '',
        'PORT' => '',
        'PATH' => '',
        'SCRIPT' => '',
        'INFO' => '',
        'QUERY' => '',
    );

    /** ----------------------------------------------------------------------------------------------------------------
     * PARSER KEYWORDS
     * URI data asigned to specific keywords.
    */
    protected static $__Parsers;

    /** ----------------------------------------------------------------------------------------------------------------
     * CLASS INITIALIZER
     * Initialize the class
     *
     * @access public
     * @param $Params [array] - An associative array of supported parrameters
     * @return void
    */
    public static function __Init($Params=array())
    {
        // Configure the class
        self::$_Script_Hidden = (isset($Params['Script_Hidden'])) ? $Params['Script_Hidden'] : FALSE;
        self::$_Public_Path = (isset($Params['Public_Path'])) ? $Params['Public_Path'] : 'public';
        self::$_Public_Relative = (isset($Params['Public_Relative'])) ? $Params['Public_Relative'] : TRUE;
        self::$_Public_Skin = (isset($Params['Public_Skin'])) ? $Params['Public_Skin'] : TRUE;
        self::$_Skin_Path = (isset($Params['Skin_Path'])) ? $Params['Skin_Path'] : 'themes';
        self::$_Skin_Relative = (isset($Params['Skin_Relative'])) ? $Params['Skin_Relative'] : TRUE;
        self::$_Skin_Default = (isset($Params['Skin_Default'])) ? $Params['Skin_Default'] : 'default';
        self::$_Fallback_Base = (isset($Params['Fallback_Base'])) ? $Params['Fallback_Base'] : '127.0.0.1';
        self::$_Fallback_Scheme = (isset($Params['Fallback_Scheme'])) ? $Params['Fallback_Scheme'] : 'http';
        self::$_Fallback_User = (isset($Params['Fallback_User'])) ? $Params['Fallback_User'] : '';
        self::$_Fallback_Passwd = (isset($Params['Fallback_Passwd'])) ? $Params['Fallback_Passwd'] : '';
        self::$_Fallback_Host = (isset($Params['Fallback_Host'])) ? $Params['Fallback_Host'] : '127.0.0.1';
        self::$_Fallback_Port = (isset($Params['Fallback_Port'])) ? $Params['Fallback_Port'] : '';
        self::$_Fallback_Script = (isset($Params['Fallback_Script'])) ? $Params['Fallback_Script'] : 'index.php';
        self::$_Separator_Scheme = (isset($Params['Separator_Scheme'])) ? $Params['Separator_Scheme'] : '://';
        self::$_Separator_Credentials = (isset($Params['Separator_Credentials'])) ? $Params['Separator_Credentials'] : ':';
        self::$_Separator_Auth = (isset($Params['Separator_Auth'])) ? $Params['Separator_Auth'] : '@';
        self::$_Separator_Port = (isset($Params['Separator_Port'])) ? $Params['Separator_Port'] : ':';
        self::$_Separator_Query = (isset($Params['Separator_Query'])) ? $Params['Separator_Query'] : '?';
        self::$_Separator_Fragment = (isset($Params['Separator_Fragment'])) ? $Params['Separator_Fragment'] : '#';
        // Do some clean up of the configurations
        self::$_Public_Path = implode('/', explode('/', str_replace(array('/', '\\'), '/', self::$_Public_Path)));
        self::$_Skin_Path = implode('/', explode('/', str_replace(array('/', '\\'), '/', self::$_Skin_Path)));
        // Extract the URL information
        self::Extract();
        // Precompile common bases
        self::$Base_Host = self::Compile('HOST');
        self::$Base_App = self::Compile('PATH');
        self::$Base_Script = self::$Base_App.(self::$_Script_Hidden ? '' : '/'.self::$__Segments['SCRIPT']);
        self::$Base_Current = self::$Base_Script.(empty(self::$__Segments['INFO']) ? '' : '/'.self::$__Segments['INFO']);
        self::$Base_Public = self::$_Public_Relative ? self::$_Public_Path : self::$Base_App.'/'.self::$_Public_Path;
        self::$Base_Skin = self::$_Skin_Relative ? self::$_Skin_Path : self::$Base_Public.'/'.self::$_Skin_Path;
        self::$Base_Skin .= '/'.self::$_Skin_Default;
        // Setup the parsers
        self::$__Parsers['SR_Key'][] = '%HostBase%';
        self::$__Parsers['SR_Data'][] =& self::$Base_Host;
        self::$__Parsers['SR_Key'][] = '%AppBase%';
        self::$__Parsers['SR_Data'][] =& self::$Base_App;
        self::$__Parsers['SR_Key'][] = '%ScriptBase%';
        self::$__Parsers['SR_Data'][] =& self::$Base_Script;
        self::$__Parsers['SR_Key'][] = '%CurrentBase%';
        self::$__Parsers['SR_Data'][] =& self::$Base_Current;
        self::$__Parsers['SR_Key'][] = '%PublicBase%';
        self::$__Parsers['SR_Data'][] =& self::$Base_Public;
        self::$__Parsers['SR_Key'][] = '%SkinBase%';
        self::$__Parsers['SR_Data'][] =& self::$Base_Skin;
        self::$__Parsers['SR_Data'][] =& self::$__Segments['SCHEME'];
        self::$__Parsers['SR_Key'][] = '%UserSegment%';
        self::$__Parsers['SR_Data'][] =& self::$__Segments['USER'];
        self::$__Parsers['SR_Key'][] = '%PasswdSegment%';
        self::$__Parsers['SR_Data'][] =& self::$__Segments['PASSWD'];
        self::$__Parsers['SR_Key'][] = '%HostSegment%';
        self::$__Parsers['SR_Data'][] =& self::$__Segments['HOST'];
        self::$__Parsers['SR_Key'][] = '%PortSegment%';
        self::$__Parsers['SR_Data'][] =& self::$__Segments['PORT'];
        self::$__Parsers['SR_Key'][] = '%PathSegment%';
        self::$__Parsers['SR_Data'][] =& self::$__Segments['PATH'];
        self::$__Parsers['SR_Key'][] = '%ScriptSegment%';
        self::$__Parsers['SR_Data'][] =& self::$__Segments['SCRIPT'];
        self::$__Parsers['SR_Key'][] = '%InfoSegment%';
        self::$__Parsers['SR_Data'][] =& self::$__Segments['INFO'];
        self::$__Parsers['SR_Key'][] = '%QuerySegment%';
        self::$__Parsers['SR_Data'][] =& self::$__Segments['QUERY'];
        self::$__Parsers['SR_Key'][] = '%PublicPath%';
        self::$__Parsers['SR_Data'][] =& self::$_Public_Path;
        self::$__Parsers['SR_Key'][] = '%SkinPath%';
        self::$__Parsers['SR_Data'][] =& self::$_Skin_Path;
        self::$__Parsers['SR_Key'][] = '%DefaultSkin%';
        self::$__Parsers['SR_Data'][] =& self::$_Skin_Default;
        // Everything OK so far
    }

    /** ----------------------------------------------------------------------------------------------------------------
     * URI EXTRACTOR
     * Try every posibility to obtain all the segments of the current URL
     *
     * @access public
     * @return array
    */
    public static function Extract()
    {
        // No point in executing twice to get the same result
        if (!empty(self::$__Segments['HOST'])) return self::$__Segments;
        // Let's try to have a falback for most basic data
        $Script_URI = (isset($_SERVER['SCRIPT_URI'])) ? parse_url($_SERVER['SCRIPT_URI']) : array();
        if (empty($Script_URI)) {
            $Script_URI = parse_url(self::$_Fallback_Base);
        }
        // Try ever possibility to obtain the data that surounds the script name
        if (isset($_SERVER['PHP_SELF'])) {
            $Script_Path = $_SERVER['PHP_SELF'];
        } elseif (isset($_SERVER['REQUEST_URI'])) {
            $Script_Path = preg_replace('/\?.*/', '', $_SERVER['REQUEST_URI']);
        } elseif (isset($Script_URI['path'])) {
            $Script_Path = $Script_URI['path'];
        } elseif (isset($_SERVER['SCRIPT_NAME'])) {
            $Script_Path = isset($_SERVER['SCRIPT_NAME']).(isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '');
        } elseif (isset($_SERVER['DOCUMENT_ROOT']) && isset($_SERVER['SCRIPT_FILENAME'])) {
            $Script_Path = substr($_SERVER['SCRIPT_FILENAME'], strlen($_SERVER['DOCUMENT_ROOT']),
                                    (strlen($_SERVER['SCRIPT_FILENAME'])-strlen($_SERVER['DOCUMENT_ROOT'])));
            $Script_Path .= (isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '');
        } else {
            $Script_Path = '';
        }
        // Explode the previously extracted data
        if (strlen($Script_Path) > 0) {
            $Script_Path = preg_split('/[\/]/', $Script_Path, -1, PREG_SPLIT_NO_EMPTY);
        } else {
            $Script_Path = array();
        }
        // Try to obtain the name of the currently executed script
        if (isset($_SERVER['SCRIPT_FILENAME'])) {
            $Script_Name = basename($_SERVER['SCRIPT_FILENAME']);
        } elseif (isset($_SERVER['SCRIPT_NAME'])) {
            $Script_Name = basename($_SERVER['SCRIPT_NAME']);
        } else {
            $Script_Name = self::$_Fallback_Script;
        }
        // Try to find the name of the script in the script path
        $Script_Split = (is_string($Script_Name)) ? array_search($Script_Name, $Script_Path, TRUE) : NULL;
        // Try to obtain the request scheme
        if (isset($_SERVER['REQUEST_SCHEME'])) {
            self::$__Segments['SCHEME'] = $_SERVER['REQUEST_SCHEME'];
        } elseif (isset($_SERVER['SERVER_PROTOCOL'])) {
            self::$__Segments['SCHEME'] = strtolower($_SERVER['SERVER_PROTOCOL']);
            self::$__Segments['SCHEME'] = substr(self::$__Segments['SCHEME'], 0, strpos(self::$__Segments['SCHEME'], '/'));
            self::$__Segments['SCHEME'] .= (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == 'on') ? 's' : '';
        } elseif (isset($Script_URI['scheme'])) {
            self::$__Segments['SCHEME'] = $Script_URI['scheme'];
        } else {
            self::$__Segments['SCHEME'] = self::$_Fallback_Scheme;
        }
        // Try to obtain the user name (if one was used)
        if (isset($_SERVER['PHP_AUTH_USER'])) {
            self::$__Segments['USER'] = $_SERVER['PHP_AUTH_USER'];
        } elseif (isset($Script_URI['user'])) {
            self::$__Segments['USER'] = $Script_URI['user'];
        } else {
            self::$__Segments['USER'] = self::$_Fallback_User;
        }
        // Try to obtain the user password (if one was used)
        if (isset($_SERVER['PHP_AUTH_PW'])) {
            self::$__Segments['PASSWD'] = $_SERVER['PHP_AUTH_PW'];
        } elseif (isset($Script_URI['pass'])) {
            self::$__Segments['PASSWD'] = $Script_URI['pass'];
        } else {
            self::$__Segments['PASSWD'] = self::$_Fallback_Passwd;
        }
        // Try to obtai the host name
        if (isset($_SERVER['SERVER_NAME'])) {
            self::$__Segments['HOST'] = $_SERVER['SERVER_NAME'];
        } elseif (isset($_SERVER['HTTP_HOST'])) {
            self::$__Segments['HOST'] = $_SERVER['HTTP_HOST'];
        } elseif (isset($Script_URI['host'])) {
            self::$__Segments['HOST'] = $Script_URI['host'];
        } else {
            self::$__Segments['HOST'] = self::$_Fallback_Host;
        }
        // Try to obtain the port number (if one was used)
        if (isset($Script_URI['port'])) {
            self::$__Segments['PORT'] = $Script_URI['port'];
        } else {
            self::$__Segments['PORT'] = self::$_Fallback_Port;
        }
        // Try to obtain the path to the script
        if (is_numeric($Script_Split)) {
            self::$__Segments['PATH'] = implode('/', array_slice($Script_Path, 0, $Script_Split, TRUE));
        } else {
            self::$__Segments['PATH'] = '';
        }
        // Try to obtain the Script name
        if (is_string($Script_Name)) {
            self::$__Segments['SCRIPT'] = $Script_Name;
        } else {
            self::$__Segments['SCRIPT'] = '';
        }
        // Try to obtain any passed info
        if (isset($_SERVER['PATH_INFO'])) {
            self::$__Segments['INFO'] = implode('/', preg_split('/[\/]/', $_SERVER['PATH_INFO'], -1, PREG_SPLIT_NO_EMPTY));
        } elseif (is_numeric($Script_Split)) {
            self::$__Segments['INFO'] = implode('/', array_slice($Script_Path, $Script_Split+1));
        } else {
            self::$__Segments['INFO'] = '';
        }
        // -----Pending Feature: Try to also extract the query string

        // Return the extracted URI segments
        return self::$__Segments;

    }

    /** ----------------------------------------------------------------------------------------------------------------
     * URI COMPILER
     * Compile raw URI segments into a usable URL
     *
     * @access public
     * @param $Until [string] - The name of the segment where compilation should stop and return
     * @return string
    */
    public static function Compile($Until=NULL)
    {
        $URI= '';
        $Until = (is_string($Until)) ? strtoupper($Until) : $Until;
        if ($Until === 'SCHEME') {
            return $URI .= (self::$__Segments['SCHEME'] !== '') ? self::$__Segments['SCHEME'].self::$_Separator_Scheme : '';
        } else {
            $URI .= (self::$__Segments['SCHEME'] !== '') ? self::$__Segments['SCHEME'].self::$_Separator_Scheme : '';
        }
        if ($Until === 'USER') {
            return $URI .= (self::$__Segments['USER'] !== '') ? self::$__Segments['USER'].self::$_Separator_Credentials : '';
        } else {
            $URI .= (self::$__Segments['USER'] !== '') ? self::$__Segments['USER'] : '';
        }
        $URI .= (self::$__Segments['USER'] !== '' || self::$__Segments['PASSWD'] !== '') ? self::$_Separator_Credentials : '';
        if ($Until === 'PASSWD') {
            return $URI .= (self::$__Segments['PASSWD'] !== '') ? self::$__Segments['PASSWD'].self::$_Separator_Auth : '';
        } else {
            $URI .= (self::$__Segments['PASSWD'] !== '') ? self::$__Segments['PASSWD'] : '';
        }
        $URI .= (self::$__Segments['USER'] !== '' || self::$__Segments['PASSWD'] !== '') ? self::$_Separator_Auth : '';
        if ($Until === 'HOST') {
            return $URI .= (self::$__Segments['HOST'] !== '') ? self::$__Segments['HOST'] : '';
        } else {
            $URI .= (self::$__Segments['HOST'] !== '') ? self::$__Segments['HOST'] : '';
        }
        if ($Until === 'PORT') {
            return $URI .= (self::$__Segments['PORT'] !== '') ? self::$_Separator_Port.self::$__Segments['PORT'] : '';
        } else {
            $URI .= (self::$__Segments['PORT'] !== '') ? self::$_Separator_Port.self::$__Segments['PORT'] : '';
        }
        if ($Until === 'PATH') {
            return $URI .= (self::$__Segments['PATH'] !== '') ? '/'.self::$__Segments['PATH'] : '';
        } else {
            $URI .= (self::$__Segments['PATH'] !== '') ? '/'.self::$__Segments['PATH'] : '';
        }
        if ($Until === 'SCRIPT') {
            return $URI .= (self::$__Segments['SCRIPT'] !== '') ? '/'.self::$__Segments['SCRIPT'] : '';
        } else {
            $URI .= (self::$__Segments['SCRIPT'] !== '') ? '/'.self::$__Segments['SCRIPT'] : '';
        }
        if ($Until === 'INFO') {
            return $URI .= (self::$__Segments['INFO'] !== '') ? '/'.self::$__Segments['INFO'] : '';
        } else {
            $URI .= (self::$__Segments['INFO'] !== '') ? '/'.self::$__Segments['INFO'] : '';
        }
        return $URI;
    }

    /** ----------------------------------------------------------------------------------------------------------------
     * SEGMENT RETRIEVER
     * Return a specific URI segment
     *
     * @access public
     * @param $Name [string] - The name of the segment you want
     * @return string (on success) bool (on failure)
    */
    public static function Segment($Name)
    {
        if (isset(self::$__Segments[$Name])) {
            return self::$__Segments[$Name];
        } return FALSE;
    }

    /** ----------------------------------------------------------------------------------------------------------------
     * BASE RETRIEVER
     * Return a specific precompiled base
     *
     * @access public
     * @param $Name [string] - The name of the base you want
     * @return mixed (on success) boolean (on failure)
    */
    public static function Base($Name)
    {
        switch ($Name) {
            case 'Host':
            case 'Domain':
                return self::$Base_Host;
            break;
            case 'App':
            case 'Base':
                return self::$Base_App;
            break;
            case 'Script':
            case 'Index':
                return self::$Base_Script;
            break;
            case 'Current':
            case 'This':
                return self::$Base_Current;
            break;
            case 'Public':
            case 'Web':
                return self::$Base_Public;
            break;
            case 'Skin':
            case 'Theme':
                return self::$Base_Skin;
            break;
            case 'All':
                return array(
                    'Host'=>self::$Base_Host,
                    'App'=>self::$Base_App,
                    'Script'=>self::$Base_Script,
                    'Current'=>self::$Base_Current,
                    'Public'=>self::$Base_Public,
                    'Skin'=>self::$Base_Skin,
                );
            break;
        } return FALSE;
    }

    /** ----------------------------------------------------------------------------------------------------------------
     * STRING PARSER
     * Replace known keywords in the specified string with current URI data
     *
     * @access public
     * @param $String [string] - A string that you want to parse
     * @return void
    */
    public static function Parse($String)
    {
        if (is_string($String)) {
            return str_replace(self::$__Parsers['SR_Key'], self::$__Parsers['SR_Data'], $String);
        } elseif (is_array($String)) {
            foreach ($String as $K => $V) {
                $Parsed[$K] = self::$replace($V);
            } return $Parsed;
        } return FALSE;
    }
}
if (isset($_URI_Params)) {
    _URI::__Init($_URI_Params);
} else {
    _URI::__Init();
} 

แน่นอนคุณต้องปรับให้เข้ากับความต้องการและระบบของคุณ!

<?php
// Change a few parameters before loading the class.
$_URI_Params = array(
    'Public_Relative' => FALSE,
    'Skin_Relative' => FALSE,
    'Skin_Default' => 'classic',
    // etc.
);
// Get the URI class
require('uri.php');
// Output all extracted URI segments
echo '<pre>';
var_dump(_URI::Extract());
echo '</pre>';
// Output extracted segments individually
echo 'Scheme: '._URI::Segment('SCHEME').'<br/>';
echo 'User: '._URI::Segment('USER').'<br/>';
echo 'Password: '._URI::Segment('PASSWD').'<br/>';
echo 'Host: '._URI::Segment('HOST').'<br/>';
echo 'Port: '._URI::Segment('PORT').'<br/>';
echo 'Path: '._URI::Segment('PATH').'<br/>';
echo 'Script: '._URI::Segment('SCRIPT').'<br/>';
echo 'Info: '._URI::Segment('INFO').'<br/>';
// Compile extracted segments into a usable URL
echo '<br/>';
echo 'Full Compiled URI: '._URI::Compile().'<br/>';
echo '<br/>';
// Output precompiled common bases for a faster result and better performance
echo 'Host Base: '._URI::Base('Host').'<br/>';
echo 'Application Base: '._URI::Base('App').'<br/>';
echo 'Running Script: '._URI::Base('Script').'<br/>';
echo 'Current URI Base: '._URI::Base('Current').'<br/>';
echo 'Public Folder Base: '._URI::Base('Public').'<br/>';
echo 'Skin Folder Base: '._URI::Base('Skin').'<br/>';
// Get all the precompiled bases in an associative array
echo '<pre>';
var_dump(_URI::Base('All'));
echo '</pre>';
// Parse an example string and replace known keys with actual URI data.
echo _URI::Parse('This is my current domain: %HostBase%
And the current application is here: %AppBase%
I load my skins form: %SkinBase%
etc.
'); 

มันยังคงต้องได้รับการทำให้สมบูรณ์ แต่มันก็เป็นทางออกของพระเจ้าสำหรับระบบ URI ส่วนกลาง: D


4

นี่คือทางออกสำหรับปัญหาของคุณ:

//Fetch page URL by this

$url = $_SERVER['REQUEST_URI'];
echo "$url<br />";

//It will print
//fetch host by this

$host=$_SERVER['HTTP_HOST'];
echo "$host<br />";

//You can fetch the full URL by this

$fullurl = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
echo $fullurl;

3

ฉันใช้คำสั่งนี้

$base = "http://$_SERVER[SERVER_NAME]:$_SERVER[SERVER_PORT]$my_web_base_path";
$url = $base . "/" . dirname(dirname(__FILE__));

ฉันหวังว่านี่จะช่วยคุณได้


3
public static function getCurrentUrl($withQuery = true)
{
    $protocol = stripos($_SERVER['SERVER_PROTOCOL'], 'https') === false ? 'http' : 'https';
    $uri = $protocol . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

    return $withQuery ? $uri : str_replace('?' . $_SERVER['QUERY_STRING'], '', $uri);
}

2

ฉันใช้โค้ดด้านล่างและมันใช้งานได้ดีสำหรับทั้งสองกรณี HTTP และ HTTPS

function curPageURL() {
  if(isset($_SERVER["HTTPS"]) && !empty($_SERVER["HTTPS"]) && ($_SERVER["HTTPS"] != 'on' )) {
        $url = 'https://'.$_SERVER["SERVER_NAME"];//https url
  }  else {
    $url =  'http://'.$_SERVER["SERVER_NAME"];//http url
  }
  if(( $_SERVER["SERVER_PORT"] != 80 )) {
     $url .= $_SERVER["SERVER_PORT"];
  }
  $url .= $_SERVER["REQUEST_URI"];
  return $url;
}

echo curPageURL();

การสาธิต


ตำแหน่งการแลกเปลี่ยนของ http และ https
Shwet

นอกจากว่าฉันเข้าใจผิด$_SERVER['HTTPS'] = 'off'จะเรียกเส้นทาง HTTPS ดูเหมือนจะไม่ถูกต้อง ในทางกลับกันฉันไม่คิดว่าตรรกะดั้งเดิมนั้นถูกต้องเช่นกัน
Nisse Engström

2
$base_dir = __DIR__; // Absolute path to your installation, ex: /var/www/mywebsite
$doc_root = preg_replace("!{$_SERVER['SCRIPT_NAME']}$!", '', $_SERVER['SCRIPT_FILENAME']); # ex: /var/www
$base_url = preg_replace("!^{$doc_root}!", '', $base_dir); # ex: '' or '/mywebsite'
$base_url = str_replace('\\', '/', $base_url);//On Windows
$base_url = str_replace($doc_root, '', $base_url);//On Windows
$protocol = empty($_SERVER['HTTPS']) ? 'http' : 'https';
$port = $_SERVER['SERVER_PORT'];
$disp_port = ($protocol == 'http' && $port == 80 || $protocol == 'https' && $port == 443) ? '' : ":$port";
$domain = $_SERVER['SERVER_NAME'];
$full_url = "$protocol://{$domain}{$disp_port}{$base_url}"; # Ex: 'http://example.com', 'https://example.com/mywebsite', etc. 

แหล่งที่มา: http://blog.lavoie.sl/2013/02/php-document-root-path-and-url-detection.html


2

นี่คือพื้นฐานของรุ่นที่ปลอดภัยกว่าของคำตอบที่ได้รับการยอมรับโดยใช้ฟังก์ชันfilter_inputของ PHP ซึ่งประกอบไปด้วยการขาดที่อาจเกิดขึ้น$_SERVER['REQUEST_URI']:

$protocol_https = filter_input(INPUT_SERVER, 'HTTPS', FILTER_SANITIZE_STRING);
$host = filter_input(INPUT_SERVER, 'HTTP_HOST', FILTER_SANITIZE_URL);
$request_uri = filter_input(INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_URL);
if(strlen($request_uri) == 0)
{
    $request_uri = filter_input(INPUT_SERVER, 'SCRIPT_NAME', FILTER_SANITIZE_URL);
    $query_string = filter_input(INPUT_SERVER, 'QUERY_STRING', FILTER_SANITIZE_URL);
    if($query_string)
    {
        $request_uri .= '?' . $query_string;
    }
}
$full_url = ($protocol_https ? 'https' : 'http') . '://' . $host . $request_uri;

คุณสามารถใช้ตัวกรองที่แตกต่างกันเพื่อปรับแต่งตามที่คุณต้องการ


1

คุณสามารถใช้HTTP_ORIGINเป็นตัวอย่างในตัวอย่างด้านล่าง:

if ( ! array_key_exists( 'HTTP_ORIGIN', $_SERVER ) ) {
    $this->referer = $_SERVER['SERVER_NAME'];
} else {
    $this->referer = $_SERVER['HTTP_ORIGIN'];
}

1

ใช้ง่ายมาก:

function current_url() {
    $current_url  = ( $_SERVER["HTTPS"] != 'on' ) ? 'http://'.$_SERVER["SERVER_NAME"] :  'https://'.$_SERVER["SERVER_NAME"];
    $current_url .= ( $_SERVER["SERVER_PORT"] != 80 ) ? ":".$_SERVER["SERVER_PORT"] : "";
    $current_url .= $_SERVER["REQUEST_URI"];

    return $current_url;
}

2
สวัสดีด้วยจำนวนคำตอบที่มีอยู่แล้วในหน้านี้คุณสามารถเพิ่มคำอธิบายเล็กน้อยว่าทำไมเรื่องนี้ถึงดีกว่าคำตอบอื่น ๆ หรือสิ่งที่แตกต่างออกไป?
IMSoP

0

ฉันคิดว่าวิธีนี้ดีมากลองเลย

if($_SERVER['HTTP_HOST'] == "localhost"){
    define('SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
    define('SITEPATH', $_SERVER['DOCUMENT_ROOT']);
    define('CSS', $_SERVER['DOCUMENT_ROOT'] . '/css/');
    define('IMAGES', $_SERVER['DOCUMENT_ROOT'] . '/images/');
}
else{
    define('SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
    define('SITEPATH', $_SERVER['DOCUMENT_ROOT']);
    define('TEMPLATE', $_SERVER['DOCUMENT_ROOT'] . '/incs/template/');
    define('CSS', $_SERVER['DOCUMENT_ROOT'] . '/css/');
    define('IMAGES', $_SERVER['DOCUMENT_ROOT'] . '/images/');
}


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.