Vraag Hoe kan ik de volledige URL van de huidige pagina op een Windows / IIS-server krijgen?


Ik ben verhuisd WordPress installatie naar een nieuwe map op een Windows /IIS server. Ik installeer 301-omleidingen in PHP, maar het lijkt niet te werken. Mijn post-URL's hebben de volgende indeling:

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

Ik kan er niet achter komen hoe ik de /post-title/ deel van de URL.

$_SERVER["REQUEST_URI"] - wat iedereen lijkt aan te bevelen - is het retourneren van een lege string. $_SERVER["PHP_SELF"] komt net terug index.php. Waarom is dit en hoe kan ik het repareren?


137
2017-10-09 20:39


oorsprong


antwoorden:


Misschien omdat je onder IIS staat

$_SERVER['PATH_INFO']

is wat je wilt, op basis van de URL's die je hebt gebruikt om uit te leggen.

Voor Apache zou je gebruiken $_SERVER['REQUEST_URI'].


135
2017-10-09 20:42



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

63
2017-08-04 21:01



Voor Apache:

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


Je kan ook gebruiken HTTP_HOST in plaats van SERVER_NAME zoals Herman opmerkte. Zien deze gerelateerde vraag voor een volledige discussie. Kortom, je bent waarschijnlijk OK met het gebruik van een van beide. Hier is de 'host'-versie:

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


Voor de Paranoïde / Waarom het belangrijk is

Typisch, ik stel in ServerName in de VirtualHost omdat ik het wil dat om de ... te zijn kanoniek vorm van de website. De $_SERVER['HTTP_HOST'] wordt ingesteld op basis van de verzoekheaders. Als de server reageert op alle / alle domeinnamen op dat IP-adres, kan een gebruiker de header vervalsen of, erger nog, iemand kan een DNS-record naar uw IP-adres verwijzen, en dan dient uw server / website een website met dynamische links gebouwd op een onjuiste URL. Als u de laatste methode gebruikt, moet u ook uw vhost of stel een .htaccess regel om het domein af te dwingen dat u wilt uitdelen, bijvoorbeeld:

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

Ik hoop dat het helpt. Het echte punt van dit antwoord was alleen maar om de eerste regel code te geven voor die mensen die hier terechtkwamen bij het zoeken naar een manier om de volledige URL met apache te krijgen :)


36
2018-04-13 00:00



$_SERVER['REQUEST_URI'] werkt niet op IIS, maar ik heb dit wel gevonden: http://neosmart.net/blog/2006/100-apache-compliant-request_uri-for-iis-and-windows/ dat klinkt veelbelovend.


11
2017-10-09 20:42



Gebruik deze klasse om de URL te laten werken.

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;

9
2017-12-19 17:07



Toevoegen:

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

Bel dan gewoon met de my_url functie.


7
2017-10-10 14:25



Ik gebruik de volgende functie om de huidige volledige URL te krijgen. Dit zou moeten werken op IIS en 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;
}

5
2017-08-04 20:41



REQUEST_URI is ingesteld door Apache, dus je krijgt het niet met IIS. Probeer een var_dump of print_r uit te voeren op $ _SERVER en bekijk welke waarden daar bestaan ​​die u kunt gebruiken.


4
2017-10-09 20:48



Het gedeelte na de titel van de URL zit achter je aan index.php bestand, wat een veelgebruikte manier is om gebruiksvriendelijke URL's te leveren zonder mod_rewrite te gebruiken. De post titel is dus eigenlijk een deel van de query-string, dus je zou het moeten kunnen krijgen met $ _SERVER ['QUERY_STRING']


3
2017-10-10 10:41



Gebruik de volgende regel bovenaan de PHP-pagina die u gebruikt $_SERVER['REQUEST_URI']. Hiermee wordt uw probleem opgelost.

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

2
2018-05-14 07:10