Nasıl bir Windows / IIS sunucusundaki geçerli sayfanın tam URL'sini alabilirim?

13 Cevap php

Ben bir Windows / IIS sunucuda yeni bir klasöre WordPress kurulumu taşındı. PHP 301 yönlendirmelerini kuruyorum, ama çalışıyor gibi görünmüyor. Benim sonrası URL'leri aşağıdaki biçime sahip:

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

Ben URL /post-title/ kısmını kapmak için nasıl anlamaya olamaz.

$_SERVER["REQUEST_URI"] - herkes tavsiye görünüyor hangi - boş bir dize döndürüyor. $_SERVER["PHP_SELF"] sadece index.php dönüyor. Neden böyle ve ben bunu nasıl düzeltebilirim?

13 Cevap

Belki, IIS altında olduğu için,

$_SERVER['PATH_INFO']

Eğer açıklamak için kullanılan URL'leri dayalı, istediğiniz şeydir.

Apache için, kullanmak istiyorum $_SERVER['REQUEST_URI'].

For Apache:

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


You can also use HTTP_HOST instead of SERVER_NAME as Herman commented. See this related question for a full discussion. In short, you are probably OK with using either. Here is the 'host' version:

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


For the Paranoid / Why it Matters

I that sitesinin canonical formu olmak istiyorum çünkü Genellikle, ben VirtualHost in ServerName set. $_SERVER['HTTP_HOST'] istek başlıklarına göre ayarlanır. Sunucu bu IP adresi herhangi / tüm alan adları için yanıt verirse, bir kullanıcı başlığı parodi olabilir, ya da daha kötüsü, birisi IP adresi için bir DNS kaydı işaret olabilir, ve sonra sunucu / web sitesi dinamik bir web sitesi üzerinden hizmet olacaktır Yanlış bir URL üzerine inşa bağlantılar. Eğer ikinci yöntemi kullanırsanız da yapılandırmanız gerekir sizin vhost ya da bir şey gibi, dışarı hizmet etmek istiyorum etki uygulamak için .htaccess kuralı kurmak:

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

Umut olur. Bu cevabın asıl nokta sadece apache ile tam URL'sini almak için bir yol ararken burada sona erdi bu insanlar için kod ilk satırı sağlamak oldu :)

REQUEST_URI Apache özgü değer, yani varsayılan olarak IIS olmayacaktır. RoBorg above ile bağlantılı montaj talimatları içeren bir geçici çözüm described here, var.

İleride, orada bir table here hangi Apache ve IIS hem de size sunulan sunucu tipi değişkenleri listeler çok kullanışlı.

$_SERVER['REQUEST_URI'] IIS üzerinde çalışmaz, ama bu buldunuz: umut verici sesler http://neosmart.net/blog/2006/100-apache-compliant-request_uri-for-iis-and-windows/ ki.

URL eserlerini almak için bu sınıfı kullanın.

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;

Ben mevcut, tam URL adresini almak için aşağıdaki işlevi kullanın. Bu, IIS ve Apache üzerinde çalışması gerekir.

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

REQUEST_URI Apache tarafından ayarlanır, bu nedenle IIS ile almazsınız. $ _SERVER Bir var_dump veya print_r yaparak deneyin ve kullanabileceğiniz ki orada var ne değerleri için bkz.

Ekle:

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

Sonra sadece my_url işlevini çağırın.

URL bir posttitle kısmı mod_rewrite kullanmadan dostu URL'ler sağlayan ortak bir yoludur index.php dosyası peşinde. Posttitle nedenle aslında sorgu dizesi bir parçası, o yüzden ['QUERY_STRING'] $ _SERVER kullanarak almak gerekir

Kullandığınız PHP sayfanın üstüne aşağıdaki satırı kullanın $_SERVER['REQUEST_URI']. Bu sorunu çözmek olacaktır.

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

Herkes unutmuş http_build_url?

http_build_url($_SERVER['REQUEST_URI']);

Hiçbir parametre iletildiğinde http_build_url otomatik olarak geçerli URL üstlenecek. Bu GET parametreleri dahil etmek için gerekli gibi görünüyor ama ben de REQUEST_URI dahil olması beklenir.

Yukarıdaki örnekte, tam URL dönecektir.

Ben aşağıdaki kodu kullanmış, ve ben doğru sonuç alıyorum ...

<?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();
?>

Ah, bir pasajı eğlenceli!

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

Bu güzel döner gibi oldu:

// 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/"
//      }