Bagaimana saya bisa mendapatkan URL lengkap halaman ini di server Windows / IIS?

137

Saya memindahkan instalasi WordPress ke folder baru di server Windows / IIS . Saya sedang menyiapkan pengalihan 301 di PHP, tetapi tampaknya tidak berhasil. URL posting saya memiliki format berikut:

http:://www.example.com/OLD_FOLDER/index.php/post-title/

Saya tidak tahu cara mengambil /post-title/bagian dari URL.

$_SERVER["REQUEST_URI"]- yang sepertinya direkomendasikan semua orang - mengembalikan string kosong. $_SERVER["PHP_SELF"]baru saja kembali index.php. Mengapa demikian, dan bagaimana cara memperbaikinya?

CtrlDot
sumber
24
Cukup lakukan print_r ($ _ SERVER) dan lihat data apa yang tersedia untuk Anda. Jika Anda bisa mendapatkan URL lengkap maka Anda dapat memanggil pathinfo ($ url) untuk mendapatkan nama file.
gradbot
18
Perlu dicatat, bahwa pertanyaan ini tentang IIS, bukan PHP pada umumnya. Di bawah Apache Anda hanya akan menggunakan $ _SERVER ['REQUEST_URI'].
Michał Tatarynowicz
@Pies Tentunya $ _SERVER ['REQUEST_URI'] adalah cara untuk pergi ... tetapi bagaimana saya bisa mengambil bagian tertentu dari URI. Sebagai contoh saya memiliki URI ini: /Appointments/Administrator/events.php/219 ... bagaimana saya bisa mendapatkan nomor tersebut setelah /events.php/
Dimitris Papageorgiou
kemungkinan duplikat Dapatkan URL lengkap di PHP
T.Todua

Jawaban:

135

Mungkin, karena Anda berada di bawah IIS,

$_SERVER['PATH_INFO']

adalah yang Anda inginkan, berdasarkan URL yang Anda gunakan untuk menjelaskan.

Untuk Apache, Anda akan menggunakan $_SERVER['REQUEST_URI'].

Vinko Vrsalovic
sumber
hai dengan menggunakan ini saya baru saja menerima kesalahan berikut? Notice: Undefined index: PATH_INFO in /home/tdpk/public_html/system/config.php on line 14
chhameed
6
Ups, drat - baru menyadari pertanyaan ini tentang IIS, dan saya menggunakan. Maaf atas downvote-nya.
Jason S
63
$pageURL = (@$_SERVER["HTTPS"] == "on") ? "https://" : "http://";
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;
Tyler Carter
sumber
11
OP dengan jelas menyatakan IIS - REQUEST_URI tidak tersedia di bawah IIS
Tom Auger
1
Anda tidak boleh menggunakan magicquote kecuali Anda benar-benar harus menggunakan php.
Kasus
2
@TomAuger Anda perlu melihat timeline. OP menambahkan ini lama setelah saya menjawab pertanyaan itu. Pertanyaan awal ditanyakan kira-kira setahun sebelum saya menjawabnya.
Tyler Carter
7
@Stan, tidak ada manfaat kinerja bersih untuk menggunakan single di atas ganda. Tidak ada, nadda, zip, nol. Ini adalah kisah istri lama dari era PHP3. Tolong jangan lakukan hal-hal sepele seperti merusak konten.
Charles
36

Untuk Apache:

'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']


Anda juga dapat menggunakan HTTP_HOSTselain SERVER_NAMEsebagai komentar Herman. Lihat pertanyaan terkait ini untuk diskusi lengkap. Singkatnya, Anda mungkin baik-baik saja dengan menggunakan keduanya. Ini adalah versi 'host':

'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']


Untuk Paranoid / Mengapa Penting

Biasanya, saya set ServerNamedi VirtualHostkarena saya ingin yang menjadi kanonik bentuk website. The $_SERVER['HTTP_HOST']diatur berdasarkan header permintaan. Jika server menanggapi salah satu / semua nama domain di alamat IP itu, pengguna dapat memalsukan tajuk, atau lebih buruk lagi, seseorang dapat mengarahkan catatan DNS ke alamat IP Anda, dan kemudian server / situs web Anda akan menyajikan situs web dengan dinamis tautan yang dibangun di atas URL yang salah. Jika Anda menggunakan metode terakhir, Anda juga harus mengonfigurasi vhostatau menyiapkan .htaccessaturan untuk menerapkan domain yang ingin Anda layani, seperti:

RewriteEngine On
RewriteCond %{HTTP_HOST} !(^stackoverflow.com*)$
RewriteRule (.*) https://stackoverflow.com/$1 [R=301,L]
#sometimes u may need to omit this slash ^ depending on your server

Semoga membantu. Inti sebenarnya dari jawaban ini hanyalah untuk memberikan baris kode pertama bagi orang-orang yang berakhir di sini ketika mencari cara untuk mendapatkan URL lengkap dengan apache :)

cwd
sumber
2
Ini harus digunakan $_SERVER['HTTP_HOST']sebagai pengganti $_SERVER['SERVER_NAME']. Jika ada penyiapan host virtual, SERVER_NAME akan menampilkan nama itu. Mungkin sesuatu seperti *.example.comitu tidak valid.
Herman J.Radtke III
9

Gunakan kelas ini agar URL berfungsi.

class VirtualDirectory
{
    var $protocol;
    var $site;
    var $thisfile;
    var $real_directories;
    var $num_of_real_directories;
    var $virtual_directories = array();
    var $num_of_virtual_directories = array();
    var $baseURL;
    var $thisURL;

    function VirtualDirectory()
    {
        $this->protocol = $_SERVER['HTTPS'] == 'on' ? 'https' : 'http';
        $this->site = $this->protocol . '://' . $_SERVER['HTTP_HOST'];
        $this->thisfile = basename($_SERVER['SCRIPT_FILENAME']);
        $this->real_directories = $this->cleanUp(explode("/", str_replace($this->thisfile, "", $_SERVER['PHP_SELF'])));
        $this->num_of_real_directories = count($this->real_directories);
        $this->virtual_directories = array_diff($this->cleanUp(explode("/", str_replace($this->thisfile, "", $_SERVER['REQUEST_URI']))),$this->real_directories);
        $this->num_of_virtual_directories = count($this->virtual_directories);
        $this->baseURL = $this->site . "/" . implode("/", $this->real_directories) . "/";
        $this->thisURL = $this->baseURL . implode("/", $this->virtual_directories) . "/";
    }

    function cleanUp($array)
    {
        $cleaned_array = array();
        foreach($array as $key => $value)
        {
            $qpos = strpos($value, "?");
            if($qpos !== false)
            {
                break;
            }
            if($key != "" && $value != "")
            {
                $cleaned_array[] = $value;
            }
        }
        return $cleaned_array;
    }
}

$virdir = new VirtualDirectory();
echo $virdir->thisURL;
Sureshkumar
sumber
10
bukankah ini sedikit berlebihan?
s3v3n
7

Menambahkan:

function my_url(){
    $url = (!empty($_SERVER['HTTPS'])) ?
               "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] :
               "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    echo $url;
}

Kemudian panggil saja my_urlfungsinya.

Avery
sumber
5

Saya menggunakan fungsi berikut untuk mendapatkan URL lengkap saat ini. Ini harus bekerja pada IIS dan Apache.

function get_current_url() {

  $protocol = 'http';
  if ($_SERVER['SERVER_PORT'] == 443 || (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')) {
    $protocol .= 's';
    $protocol_port = $_SERVER['SERVER_PORT'];
  } else {
    $protocol_port = 80;
  }

  $host = $_SERVER['HTTP_HOST'];
  $port = $_SERVER['SERVER_PORT'];
  $request = $_SERVER['PHP_SELF'];
  $query = isset($_SERVER['argv']) ? substr($_SERVER['argv'][0], strpos($_SERVER['argv'][0], ';') + 1) : '';

  $toret = $protocol . '://' . $host . ($port == $protocol_port ? '' : ':' . $port) . $request . (empty($query) ? '' : '?' . $query);

  return $toret;
}
Jrgns
sumber
argv tidak akan berfungsi jika Anda tidak menggunakan Apache atau IIS berbasis CGI, saya kira. Saya mencoba kode Anda di atas pada Apache2 dalam mode biasa (bukan mode CGI) dan mengalami kesalahan karena $ _SERVER ['arv'] [0] bukan indeks. Perhatikan juga bahwa saya telah mengaktifkan pelaporan kesalahan PHP penuh dan kesalahan ini adalah kesalahan pemberitahuan.
Volomike
Bekerja seperti pesona, hanya membutuhkan sedikit update untuk mencegah kesalahan pada parameter string query: $query = isset($_SERVER['argv']) ? substr($_SERVER['argv'][0], strpos($_SERVER['argv'][0], ';') + 1) : '';. Saya telah memperbarui jawaban Anda untuk menyertakan ini.
Zuul
4

REQUEST_URI disetel oleh Apache, jadi Anda tidak akan mendapatkannya dengan IIS. Coba lakukan var_dump atau print_r pada $ _SERVER dan lihat nilai apa yang ada di sana yang dapat Anda gunakan.

Peter Bailey
sumber
3

Bagian posttitle dari URL adalah setelah index.phpfile Anda , yang merupakan cara umum untuk menyediakan URL yang bersahabat tanpa menggunakan mod_rewrite. Oleh karena itu, judul pos sebenarnya adalah bagian dari string kueri, jadi Anda bisa mendapatkannya menggunakan $ _SERVER ['QUERY_STRING']

Adam Hopkinson
sumber
2

Gunakan baris berikut di bagian atas halaman PHP tempat Anda menggunakan $_SERVER['REQUEST_URI']. Ini akan menyelesaikan masalah Anda.

$_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'] . '?' . $_SERVER['argv'][0];
beniwal
sumber
1

Oh, asyiknya cuplikan!

if (!function_exists('base_url')) {
    function base_url($atRoot=FALSE, $atCore=FALSE, $parse=FALSE){
        if (isset($_SERVER['HTTP_HOST'])) {
            $http = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
            $hostname = $_SERVER['HTTP_HOST'];
            $dir =  str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);

            $core = preg_split('@/@', str_replace($_SERVER['DOCUMENT_ROOT'], '', realpath(dirname(__FILE__))), NULL, PREG_SPLIT_NO_EMPTY);
            $core = $core[0];

            $tmplt = $atRoot ? ($atCore ? "%s://%s/%s/" : "%s://%s/") : ($atCore ? "%s://%s/%s/" : "%s://%s%s");
            $end = $atRoot ? ($atCore ? $core : $hostname) : ($atCore ? $core : $dir);
            $base_url = sprintf( $tmplt, $http, $hostname, $end );
        }
        else $base_url = 'http://localhost/';

        if ($parse) {
            $base_url = parse_url($base_url);
            if (isset($base_url['path'])) if ($base_url['path'] == '/') $base_url['path'] = '';
        }

        return $base_url;
    }
}

Ini memiliki pengembalian yang indah seperti:

// A URL like http://stackoverflow.com/questions/189113/how-do-i-get-current-page-full-url-in-php-on-a-windows-iis-server:

echo base_url();    // Will produce something like: http://stackoverflow.com/questions/189113/
echo base_url(TRUE);    // Will produce something like: http://stackoverflow.com/
echo base_url(TRUE, TRUE); || echo base_url(NULL, TRUE); //Will produce something like: http://stackoverflow.com/questions/

// And finally:
echo base_url(NULL, NULL, TRUE);
// Will produce something like:
//      array(3) {
//          ["scheme"]=>
//          string(4) "http"
//          ["host"]=>
//          string(12) "stackoverflow.com"
//          ["path"]=>
//          string(35) "/questions/189113/"
//      }
SpYk3HH
sumber
0

Semua orang lupa http_build_url ?

http_build_url($_SERVER['REQUEST_URI']);

Ketika tidak ada parameter yang diteruskan ke http_build_urlsana secara otomatis akan menganggap URL saat ini. Saya berharap REQUEST_URIuntuk disertakan juga, meskipun tampaknya diperlukan untuk menyertakan parameter GET.

Contoh di atas akan mengembalikan URL lengkap.

Gajus
sumber
1
Ini membutuhkan pecl_http.
Omar Abid
@OmarAbid Saya merekomendasikannya. :-)
Gajus
Saya mengerti posisi Anda. Tetapi ketika membuat skrip yang akan digunakan di berbagai platform yang tidak dapat Anda kendalikan, Anda harus memilih sesuatu yang cukup standar.
Omar Abid
1
Jika Anda membangun perpustakaan, Anda bebas menentukan persyaratannya. Pertanyaan awal sama sekali tidak membahas skenario seperti itu. Oleh karena itu, masuk akal untuk menyebutkan semua alternatif.
Gajus
0

Saya telah menggunakan kode berikut, dan saya mendapatkan hasil yang benar ...

<?php
    function currentPageURL() {
        $curpageURL = 'http';
        if ($_SERVER["HTTPS"] == "on") {
            $curpageURL.= "s";
        }
        $curpageURL.= "://";
        if ($_SERVER["SERVER_PORT"] != "80") {
            $curpageURL.= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
        } 
        else {
            $curpageURL.= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
        }
        return $curpageURL;
    }
    echo currentPageURL();
?>
Pengembang Joomla
sumber
Ini Bekerja dengan Baik Jika Anda Tidak Ada HTTPS maka Anda ingin menghapus barisnya.
0

Di server apache saya, ini memberi saya URL lengkap dalam format persis yang Anda cari:

$_SERVER["SCRIPT_URI"]
Hüseyin Yağlı
sumber
0

Dukungan Proksi Terbalik!

Sesuatu yang sedikit lebih kuat. Catatan Ini hanya akan bekerja pada 5.3atau lebih besar.

/*
 * Compatibility with multiple host headers.
 * Support of "Reverse Proxy" configurations.
 *
 * Michael Jett <mjett@mitre.org>
 */

function base_url() {

    $protocol = @$_SERVER['HTTP_X_FORWARDED_PROTO'] 
              ?: @$_SERVER['REQUEST_SCHEME']
              ?: ((isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") ? "https" : "http");

    $port = @intval($_SERVER['HTTP_X_FORWARDED_PORT'])
          ?: @intval($_SERVER["SERVER_PORT"])
          ?: (($protocol === 'https') ? 443 : 80);

    $host = @explode(":", $_SERVER['HTTP_HOST'])[0]
          ?: @$_SERVER['SERVER_NAME']
          ?: @$_SERVER['SERVER_ADDR'];

    // Don't include port if it's 80 or 443 and the protocol matches
    $port = ($protocol === 'https' && $port === 443) || ($protocol === 'http' && $port === 80) ? '' : ':' . $port;

    return sprintf('%s://%s%s/%s', $protocol, $host, $port, @trim(reset(explode("?", $_SERVER['REQUEST_URI'])), '/'));
}
pengguna1949536
sumber