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?
Jawaban:
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']
.sumber
Notice: Undefined index: PATH_INFO in /home/tdpk/public_html/system/config.php on line 14
$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;
sumber
Untuk Apache:
'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']
Anda juga dapat menggunakan
HTTP_HOST
selainSERVER_NAME
sebagai 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
ServerName
diVirtualHost
karena 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 mengonfigurasivhost
atau menyiapkan.htaccess
aturan 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 :)
sumber
$_SERVER['HTTP_HOST']
sebagai pengganti$_SERVER['SERVER_NAME']
. Jika ada penyiapan host virtual, SERVER_NAME akan menampilkan nama itu. Mungkin sesuatu seperti*.example.com
itu tidak valid.$_SERVER['REQUEST_URI']
tidak berfungsi di IIS, tetapi saya menemukan ini: http://neosmart.net/blog/2006/100-apache-compliant-request_uri-for-iis-and-windows/ yang kedengarannya menjanjikan.sumber
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;
sumber
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_url
fungsinya.sumber
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; }
sumber
$query = isset($_SERVER['argv']) ? substr($_SERVER['argv'][0], strpos($_SERVER['argv'][0], ';') + 1) : '';
. Saya telah memperbarui jawaban Anda untuk menyertakan ini.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.
sumber
Bagian posttitle dari URL adalah setelah
index.php
file 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']sumber
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];
sumber
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/" // }
sumber
Semua orang lupa http_build_url ?
http_build_url($_SERVER['REQUEST_URI']);
Ketika tidak ada parameter yang diteruskan ke
http_build_url
sana secara otomatis akan menganggap URL saat ini. Saya berharapREQUEST_URI
untuk disertakan juga, meskipun tampaknya diperlukan untuk menyertakan parameter GET.Contoh di atas akan mengembalikan URL lengkap.
sumber
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(); ?>
sumber
Di server apache saya, ini memberi saya URL lengkap dalam format persis yang Anda cari:
$_SERVER["SCRIPT_URI"]
sumber
Dukungan Proksi Terbalik!
Sesuatu yang sedikit lebih kuat. Catatan Ini hanya akan bekerja pada
5.3
atau 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'])), '/')); }
sumber