Pertanyaan Dapatkan URL lengkap dalam PHP


Saya menggunakan kode ini untuk mendapatkan URL lengkap:

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

Masalahnya adalah saya menggunakan beberapa topeng di saya .htaccess, jadi apa yang kita lihat di URL tidak selalu jalan sebenarnya dari file.

Yang saya perlukan adalah mendapatkan URL, apa yang tertulis di URL, tidak lebih dan tidak kurang — URL lengkap.

Saya harus mendapatkan tampilannya di Navigation Bar di browser web, dan bukan jalur sebenarnya dari file di server.


979
2017-07-20 21:29


asal


Jawaban:


Silahkan lihat $_SERVER['REQUEST_URI'], i.e.

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

(Perhatikan bahwa sintaks string yang dikutip ganda adalah sangat benar)

Jika Anda ingin mendukung HTTP dan HTTPS, Anda dapat menggunakan

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

Catatan Editor: menggunakan kode ini implikasi keamanan. Klien dapat menetapkan HTTP_HOST dan REQUEST_URI ke nilai sewenang-wenang yang diinginkannya.


1623
2017-07-20 21:33



Versi pendek untuk menghasilkan tautan pada halaman web

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

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

Berikut adalah beberapa detail lebih lanjut tentang masalah dan kasus tepi //example.com/path/ format

Versi lengkap

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;

Ini adalah versi yang sangat dimodifikasi dari http://snipplr.com/view.php?codeview&id=2734.

Struktur URL:

skema://nama pengguna: kata sandi@domain: port / path? query_string #fragment_id

Bagian-bagian yang dicetak tebal tidak akan dimasukkan oleh fungsi

Catatan:

  • Fungsi ini tidak termasuk username:password dari URL lengkap atau fragmen (hash).
  • Ini tidak akan menampilkan port default 80 untuk HTTP dan port 443 untuk HTTPS.
  • Hanya diuji dengan skema http dan https.
  • Itu #fragment_id tidak dikirim ke server oleh klien (browser) dan tidak akan ditambahkan ke URL lengkap.
  • $_GET hanya akan berisi foo=bar2 untuk URL seperti /example?foo=bar1&foo=bar2.
  • Beberapa CMS dan lingkungan akan menulis ulang $_SERVER['REQUEST_URI'] dan kembali /example?foo=bar2 untuk URL seperti /example?foo=bar1&foo=bar2, gunakan $_SERVER['QUERY_STRING'] pada kasus ini.
  • Perlu diingat bahwa sebuah URI = URL + URN, tetapi karena penggunaan populer, URL sekarang berarti URI dan URL.
  • Anda harus menghapus HTTP_X_FORWARDED_HOST jika Anda tidak berencana untuk menggunakan proksi atau penyeimbang.
  • Itu spesifikasi mengatakan bahwa Host tajuk harus berisi nomor port kecuali jika merupakan nomor default.

Variabel yang dikontrol klien (Browser):

  • $_SERVER['REQUEST_URI']. Semua karakter yang tidak didukung dikodekan oleh browser sebelum dikirim.
  • $_SERVER['HTTP_HOST'] dan tidak selalu tersedia sesuai dengan komentar di manual PHP: http://php.net/manual/en/reserved.variables.php
  • $_SERVER['HTTP_X_FORWARDED_HOST'] diatur oleh balancers dan tidak disebutkan dalam daftar $_SERVER variabel dalam manual PHP.

Variabel yang dikontrol oleh server:

  • $_SERVER['HTTPS']. Klien memilih untuk menggunakan ini, tetapi server mengembalikan nilai aktual kosong atau "aktif".
  • $_SERVER['SERVER_PORT']. Server hanya menerima nomor yang diizinkan sebagai port.
  • $_SERVER['SERVER_PROTOCOL']. Server hanya menerima protokol tertentu.
  • $_SERVER['SERVER_NAME'] . Ini diatur secara manual dalam konfigurasi server dan tidak tersedia untuk IPv6 menurut kralyk.

Terkait:

HTTP_HOST vs. SERVER_NAME
Apakah Nomor Port Diperlukan di HTTP "Host" Header Parameter?
https://stackoverflow.com/a/28049503/175071


357
2018-01-17 08:57



Untuk itu, lihat saja seluruh array dengan print_r($_SERVER), Anda akan melihat semua yang Anda butuhkan di sana :)


190
2017-07-20 21:35



Contoh untuk URL: https://example.com/subFolder/yourfile.php?var=blabla#12345

//built-in function 
$x = parse_url($url);
$x['scheme']               🡺 https
$x['host']                 🡺         example.com (or with WWW)
$x['path']                 🡺                    /subFolder/yourfile.php
$x['query']                🡺                                          var=blabla
$x['fragment']             🡺                                                     12345 // hashtag outputed only in case, when hashtag-containing string was manually passed to function, otherwise PHP is unable to recognise hashtags in $_SERVER

//built-in function  (with this function, I only recommend to pass `parse_url`s output as argument)
$A = pathinfo($url);
$B = pathinfo(parse_url($url)['path']);
$A['dirname']              🡺 https://example.com/subFolder
$B['dirname']              🡺                    /subFolder
$A['basename']             🡺                               yourfile.php?var=blabla#12345
$B['basename']             🡺                               yourfile.php
$A['extension']            🡺                                        php?var=blabla#12345
$B['extension']            🡺                                        php
$A['filename']             🡺                               yourfile
$B['filename']             🡺                               yourfile


//=================================================== //
//========== 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/yourfile.php?var=blabla
$_SERVER["QUERY_STRING"]   🡺                                               var=blabla
__FILE__                   🡺 /home/user/public_html/subFolder/yourfile.php
__DIR__                    🡺 /home/user/public_html/subFolder              //same: dirname(__FILE__)
$_SERVER["REQUEST_URI"]    🡺                       /subFolder/yourfile.php?var=blabla
parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)🡺  /subFolder/yourfile.php 
$_SERVER["PHP_SELF"]       🡺                       /subFolder/yourfile.php

// ==================================================================//
//if "YOURFILE.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?abc
__FILE__                   🡺 /home/user/public_html/subFolder/yourfile.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)             🡺 yourfile.php

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

Melihat!:

  • hastag (# ...) bagian url tidak dapat dideteksi dari PHP (sisi-server). Untuk itu, gunakan Javascript.
  • DIRECTORY_SEPARATOR kembali \ untuk Windows-type hostings, bukan /.



Untuk 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/  

171
2017-11-15 09:59



Berikut ini solusi menggunakan pernyataan terner, menjaga kode minimal:

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

Ini adalah cara terkecil dan termudah untuk melakukannya, dengan asumsi bahwa server web seseorang menggunakan port 443 standar untuk HTTPS.


54
2018-04-24 13:30



Metode lintas platform favorit saya untuk menemukan URL saat ini adalah:

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

39
2018-05-18 01:54



Cukup gunakan:

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

22
2017-12-09 09:07