2010-08-07 12 views
30

Ésta es la url de mi guión: localhost/do/index.phpObtienen el directorio base del script actual

Quiero una variable o una función que devuelve localhost/do (algo así como $_SERVER['SERVER_NAME'].'/do')

+0

Parece que no se sabe muy bien lo que quiere –

+0

lo sé, pero mi Inglés es veryyyy mala triste :(no – Snoob

Respuesta

26

Probar:

$url = $_SERVER['REQUEST_URI']; //returns the current URL 
$parts = explode('/',$url); 
print_r($parts); 

EDITAR:

$url = $_SERVER['REQUEST_URI']; //returns the current URL 
$parts = explode('/',$url); 
$dir = $_SERVER['SERVER_NAME']; 
for ($i = 0; $i < count($parts) - 1; $i++) { 
$dir .= $parts[$i] . "/"; 
} 
echo $dir; 

Esto debería devolver localhost/do/

+0

funciona ...;. n – Snoob

+0

Creo que sé a qué se dirige: consulte mi actualización – Calvin

+1

Basta con usar 'dirname()', que no comprueba si el directorio existe realmente. El valor devuelto por 'dirname ('/ solar/system'') es''/solar'', cualquiera que sea el directorio/solar existente, o no. – kiamlaluno

8

php tiene muchas funciones para el análisis de cadenas que se pueden hacer con una simple de una sola línea de fragmentos
dirname() (que usted pidió) y parse_url() (que necesita) se encuentran entre ellos

<?php 

echo "Request uri is: ".$_SERVER['REQUEST_URI']; 
echo "<br>"; 

$curdir = dirname($_SERVER['REQUEST_URI'])."/"; 

echo "Current dir is: ".$curdir; 
echo "<br>"; 

barra de direcciones en el navegador es

http://localhost/do/index.php 

salida es

Request uri is: /do/index.php 
Current dir is: /do/ 
+0

puede dar un ejemplo, no funciona – Snoob

+0

@Snoob aquí va su ejemplo. Ahora si puede explicar para qué está tratando de usar ese "dic base", le diré por qué no funciona –

+1

Funciona si url es localhost/do/index.php, pero cuando uso localhost/do. Salida: Request uri es:/ds/Current dir es: \/ – Snoob

1

dirname le dará la parte del directorio de una ruta de archivo. Por ejemplo:

echo dirname('/path/to/file.txt'); // Outputs "/path/to" 

Obtener la URL del script actual es un poco más difícil, pero $_SERVER['REQUEST_URI'] le devuelva la parte después de que el nombre de dominio (es decir, se le daría "/do/index.php").

+0

echo dirname ($ _ SERVER ['REQUEST_URI']); http: // localhost/do/=> return \; http: // localhost/do/index.php => return/do – Snoob

+0

Observar que si la URL es 'http: // localhost/do/index.php',' localhost' no se incluye desde el valor devuelto por 'dirname ($ _ SERVER ['REQUEST_URI'])'. – kiamlaluno

+0

@Snoob y @kiamlaluno: Ya me he dirigido a esto en mi publicación original diciendo que '$ _SERVER ['REQUEST_URI']' devolverá la parte después del nombre de dominio (o, en este caso, el nombre del servidor). – hbw

2

Si desea incluir el nombre del servidor, según entendí, a continuación, los siguientes fragmentos de código deben hacer lo que usted está pidiendo:

$result = $_SERVER['SERVER_NAME'] . dirname(__FILE__); 

$result = $_SERVER['SERVER_NAME'] . __DIR__; // PHP 5.3 

$result = $_SERVER['SERVER_NAME'] . '/' . dirname($_SERVER['REQUEST_URI']); 
30
$_SERVER['SERVER_NAME'] . dirname($_SERVER['REQUEST_URI']); 
+0

excelente respuesta, pero esto no funciona en IIS desafortunadamente como dirname devuelve ventanas barras diagonales – icc97

+3

en realidad solo devuelve una barra diagonal inversa si el URI de solicitud es localhost/do/en lugar de localhost/do/index.php. Lo solucioné usando PHP_SELF que siempre incluye el índice.php, entonces '$ current_dir_url = $ _SERVER ['SERVER_NAME']. dirname ($ _ SERVER ['PHP_SELF']); ' – icc97

+0

No sugiero usar dirname(). Al principio: esta respuesta es incorrecta, ya que devuelve el padre y no el directorio actual, pero incluso si agrega una barra inclinada (como @Your Common Sense lo hizo) se enfrenta a un problema con $ _SERVER ['REQUEST_URI'] ya que contiene solo '/' si llama a 'http: // example.com /'. Por ese 'dirname()' devolvería '/' y cuando agregue su segundo '/' resulta '//'. Usted tiene el mismo problema con el uso de '$ _SERVER ['PHP_SELF'])'. Ver mi respuesta para más información. – mgutt

6

Cuando estaba poniendo en práctica algunas de estas respuestas golpeo algunos problemas ya que estoy usando IIS y también quería una URL totalmente calificada con el protocolo también. Utilicé PHP_SELF en lugar de REQUEST_URI como dirname('/do/') da '/' (o '\') en Windows, cuando desea que se devuelva '/do/'.

if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off') { 
    $protocol = 'http://'; 
} else { 
    $protocol = 'https://'; 
} 
$base_url = $protocol . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']); 
8

Sugiero no usar dirname(). Tuve varios problemas con múltiples barras y resultados inesperados.Esa fue la razón por la que creé currentdir():

function currentdir($url) { 
    // note: anything without a scheme ("example.com", "example.com:80/", etc.) is a folder 
    // remove query (protection against "?url=http://example.com/") 
    if ($first_query = strpos($url, '?')) $url = substr($url, 0, $first_query); 
    // remove fragment (protection against "#http://example.com/") 
    if ($first_fragment = strpos($url, '#')) $url = substr($url, 0, $first_fragment); 
    // folder only 
    $last_slash = strrpos($url, '/'); 
    if (!$last_slash) { 
     return '/'; 
    } 
    // add ending slash to "http://example.com" 
    if (($first_colon = strpos($url, '://')) !== false && $first_colon + 2 == $last_slash) { 
     return $url . '/'; 
    } 
    return substr($url, 0, $last_slash + 1); 
} 

Por qué no debe usar dirname()

Suponga que tiene image.jpg situado en images/ y tiene el siguiente código:

<img src="<?php echo $url; ?>../image.jpg" /> 

Supongamos ahora que $url podría contener valores diferentes:

  • http://example.com/index.php
  • http://example.com/images/
  • http://example.com/images//
  • http://example.com/
  • etc.

Sea lo que contiene, necesitamos el directorio actual para producir un deeplink de trabajo. Intenta dirname() y se enfrentan a los siguientes problemas:

1.) Los diferentes resultados para los archivos y directorios

archivos
dirname('http://example.com/images/index.php') vuelve http://example.com/images

Directorio
dirname('http://example.com/images/') vuelve http://example.com

Pero no hay problema. Podríamos cubrir esto mediante un truco:
dirname('http://example.com/images/' . '&') . '/' vuelve http://example.com/images/

ahora dirname() rendimientos en ambos casos el directorio actual es necesario. Pero vamos a tener otros problemas:

2.) Algunas múltiples barras serán eliminados
dirname('http://example.com//images//index.php') vuelve http://example.com//images

Por supuesto que no está bien formado este URL, sino múltiples cuchilladas a pasar y tenemos que actuar como navegadores como webmasters los usan para verificar su salida. Y tal vez se pregunte, pero las primeras tres imágenes del siguiente ejemplo están todas cargadas.

<img src="http://example.com/images//../image.jpg" /> 
<img src="http://example.com/images//image.jpg" /> 
<img src="http://example.com/images/image.jpg" /> 
<img src="http://example.com/images/../image.jpg" /> 

Esa es la razón por la que debe mantener varias barras diagonales. Como dirname() elimina solo algunas barras múltiples, abrí un bug ticket.

3.) URL raíz no vuelve directorio raíz
dirname('http://example.com') vuelve http:
dirname('http://example.com/') devuelve http:

4.) Directorio raíz devuelve ruta relativa
dirname('foo/bar') vuelve .

que cabe esperar /.

5.) URL incorrecto codificados
dirname('foo/bar?url=http://example.com') devuelve foo/bar?url=http:

Todos los resultados de las pruebas:
http://www.programmierer-forum.de/aktuelles-verzeichnis-alternative-zu-dirname-t350590.htm#4329444

+0

hace pensar que dirname no era para las URL – icc97

+0

esta debería ser la respuesta aceptada – Luvias

1

la mejor forma de hacerlo es utilizar la función de explotar/implosión (incorporado en PHP) como entonces

$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; 
$parts = explode('/',$actual_link); 
$parts[count($parts) - 1] = ""; 
$actual_link = implode('/',$parts); 
echo $actual_link; 
0

Mi sugerencia:

const DELIMITER_URL = '/'; 
$urlTop = explode(DELIMITER_URL, trim(input_filter(INPUT_SERVER,'REQUEST_URI'), DELIMITER_URL))[0] 

prueba:

const DELIMITER_URL = '/'; 
$testURL = "/top-dir"; 
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]); 

$testURL = "/top-dir/"; 
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]); 

$testURL = "/top-dir/test"; 
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]); 

$testURL = "/top-dir/test/"; 
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]); 

$testURL = "/top-dir/test/this.html"; 
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]); 

$testURL = "/top-dir/test.html"; 
var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]); 

salida de prueba:

string(7) "top-dir" 
string(7) "top-dir" 
string(7) "top-dir" 
string(7) "top-dir" 
string(7) "top-dir" 
string(7) "top-dir" 
Cuestiones relacionadas