php - request_uri - ¿Cómo puedo obtener la URL completa de la página actual en un servidor Windows/IIS?
php obtener url sin parametros (15)
WordPress una instalación de WordPress a una nueva carpeta en un servidor de Windows / IIS . Estoy configurando 301 redirecciones en PHP, pero parece que no funciona. Mis URLs de publicación tienen el siguiente formato:
http:://www.example.com/OLD_FOLDER/index.php/post-title/
No puedo entender cómo agarrar el /post-title/
parte de la URL.
$_SERVER["REQUEST_URI"]
, que todos parecen recomendar, devuelve una cadena vacía. $_SERVER["PHP_SELF"]
acaba de devolver index.php
. ¿Por qué es esto y cómo puedo solucionarlo?
Reverse Proxy Support!
Algo un poco más robusto. Nota: solo funcionará en 5.3
o superior.
/*
* Compatibility with multiple host headers.
* Support of "Reverse Proxy" configurations.
*
* Michael Jett <[email protected]>
*/
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''])), ''/''));
}
Para Apache:
''http''.(empty($_SERVER[''HTTPS''])?'''':''s'').''://''.$_SERVER[''SERVER_NAME''].$_SERVER[''REQUEST_URI'']
También puede usar HTTP_HOST
lugar de SERVER_NAME
como comentó Herman. Vea esta pregunta relacionada para una discusión completa. En resumen, probablemente estés bien con el uso de cualquiera de los dos. Aquí está la versión ''host'':
''http''.(empty($_SERVER[''HTTPS''])?'''':''s'').''://''.$_SERVER[''HTTP_HOST''].$_SERVER[''REQUEST_URI'']
Para el paranoico / por qué es importante
Normalmente, configuro ServerName
en VirtualHost
porque quiero que sea la forma canonical del sitio web. El $_SERVER[''HTTP_HOST'']
se establece en función de los encabezados de solicitud. Si el servidor responde a cualquiera / todos los nombres de dominio en esa dirección IP, un usuario podría falsificar el encabezado, o peor, alguien podría apuntar un registro DNS a su dirección IP, y luego su servidor / sitio web estaría atendiendo un sitio web con dinámica enlaces construidos en una URL incorrecta. Si usa el último método, también debe configurar su vhost
o configurar una regla .htaccess
para aplicar el dominio que desea atender, como por ejemplo:
RewriteEngine On
RewriteCond %{HTTP_HOST} !(^.com*)$
RewriteRule (.*) https://.com/$1 [R=301,L]
#sometimes u may need to omit this slash ^ depending on your server
Espero que ayude. El verdadero objetivo de esta respuesta fue simplemente proporcionar la primera línea de código para las personas que terminaron aquí cuando buscaban la manera de obtener la URL completa con apache :)
¿Todos olvidaron http_build_url ?
http_build_url($_SERVER[''REQUEST_URI'']);
Cuando no se pasan parámetros a http_build_url
, asumirá automáticamente la URL actual. También esperaría que se incluyera REQUEST_URI
, aunque parece ser necesario para incluir los parámetros GET.
El ejemplo anterior devolverá la URL completa.
Añadir:
function my_url(){
$url = (!empty($_SERVER[''HTTPS''])) ?
"https://".$_SERVER[''SERVER_NAME''].$_SERVER[''REQUEST_URI''] :
"http://".$_SERVER[''SERVER_NAME''].$_SERVER[''REQUEST_URI''];
echo $url;
}
Entonces simplemente llame a la función my_url
.
En mi servidor apache, esto me da la URL completa en el formato exacto que está buscando:
$_SERVER["SCRIPT_URI"]
He usado el siguiente código, y obtengo el resultado correcto ...
<?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();
?>
La parte del título de la URL está después de su archivo index.php
, que es una forma común de proporcionar URL amigables sin usar mod_rewrite. El título del post es en realidad parte de la cadena de consulta, por lo que debería poder obtenerlo usando $ _SERVER [''QUERY_STRING'']
Oh, la diversión de un fragmento!
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;
}
}
Tiene bonitos retornos como:
// A URL like http://.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://.com/questions/189113/
echo base_url(TRUE); // Will produce something like: http://.com/
echo base_url(TRUE, TRUE); || echo base_url(NULL, TRUE); //Will produce something like: http://.com/questions/
// And finally:
echo base_url(NULL, NULL, TRUE);
// Will produce something like:
// array(3) {
// ["scheme"]=>
// string(4) "http"
// ["host"]=>
// string(12) ".com"
// ["path"]=>
// string(35) "/questions/189113/"
// }
REQUEST_URI está configurado por Apache, por lo que no lo obtendrá con IIS. Intenta hacer var_dump o print_r en $ _SERVER y ver qué valores existen allí que puedes usar.
Tal vez, porque estás bajo IIS,
$_SERVER[''PATH_INFO'']
es lo que quieres, basado en las URL que solías explicar.
Para Apache, usaría $_SERVER[''REQUEST_URI'']
.
Use la siguiente línea en la parte superior de la página PHP donde está usando $_SERVER[''REQUEST_URI'']
. Esto resolverá tu problema.
$_SERVER[''REQUEST_URI''] = $_SERVER[''PHP_SELF''] . ''?'' . $_SERVER[''argv''][0];
Uso la siguiente función para obtener la URL completa actual. Esto debería funcionar en IIS y 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;
}
Utiliza esta clase para que la URL funcione.
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;
$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;