print - php get current script folder
Obtener el directorio base del script actual (10)
Cuando estaba implementando algunas de estas respuestas, encontré algunos problemas mientras utilizaba IIS y también quería una URL completa con el protocolo. PHP_SELF lugar de REQUEST_URI como dirname(''/do/'') da ''/'' (o ''/' ) en Windows, cuando quiere que ''/do/'' sea devuelto.
if (empty($_SERVER[''HTTPS'']) || $_SERVER[''HTTPS''] === ''off'') {
$protocol = ''http://'';
} else {
$protocol = ''https://'';
}
$base_url = $protocol . $_SERVER[''SERVER_NAME''] . dirname($_SERVER[''PHP_SELF'']);
Esta es la url de mi script: localhost/do/index.php
Quiero una variable o una función que devuelva localhost/do (algo como $_SERVER[''SERVER_NAME''].''/do'' )
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"
Si desea incluir el nombre del servidor, tal como lo entendí, entonces los siguientes fragmentos de código deberían hacer lo que solicita:
$result = $_SERVER[''SERVER_NAME''] . dirname(__FILE__);
$result = $_SERVER[''SERVER_NAME''] . __DIR__; // PHP 5.3
$result = $_SERVER[''SERVER_NAME''] . ''/'' . dirname($_SERVER[''REQUEST_URI'']);
Sugiero no usar dirname() . Tuve varios problemas con múltiples barras y resultados inesperados en absoluto. 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 debes usar dirname ()
Supongamos que tiene image.jpg ubicado en images/ y tiene el siguiente código:
<img src="<?php echo $url; ?>../image.jpg" />
Ahora asuma que $url podría contener diferentes valores:
-
http://example.com/index.php -
http://example.com/images/ -
http://example.com/images// -
http://example.com/ - etc.
Independientemente de lo que contenga, necesitamos el directorio actual para producir un enlace de trabajo. Intenta dirname() y enfrentas los siguientes problemas:
1.) Diferentes resultados para archivos y directorios.
Archivo
dirname(''http://example.com/images/index.php'') devuelve http://example.com/images
Directorio
dirname(''http://example.com/images/'') devuelve http://example.com
Pero no hay problema. Podríamos cubrir esto por un truco:
dirname(''http://example.com/images/'' . ''&'') . ''/'' dirname(''http://example.com/images/'' . ''&'') . ''/'' devuelve http://example.com/images/
Ahora dirname() devuelve en ambos casos el directorio actual necesario. Pero tendremos otros problemas:
2.) Se eliminarán algunas barras múltiples
dirname(''http://example.com//images//index.php'') devuelve http://example.com//images
Por supuesto, esta URL no está bien formada, pero se producen varias barras diagonales y debemos actuar como navegadores, ya que los webmasters los usan para verificar su salida. Y tal vez se pregunte, pero las tres primeras imágenes del siguiente ejemplo están 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 múltiples barras diagonales. Como dirname() elimina solo algunas barras diagonales, abrí un ticket de error .
3.) La URL raíz no devuelve el directorio raíz
dirname(''http://example.com'') devuelve http:
dirname(''http://example.com/'') devuelve http:
4.) El directorio raíz devuelve la ruta relativa
dirname(''foo/bar'') devuelve .
Yo esperaría.
5.) URL codificadas incorrectas
dirname(''foo/bar?url=http://example.com'') devuelve foo/bar?url=http:
Todos los resultados de la prueba:
http://www.programmierer-forum.de/aktuelles-verzeichnis-alternative-zu-dirname-t350590.htm#4329444
Tratar:
$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/
Una solución más corta (y correcta) que mantiene una barra diagonal:
$url = $_SERVER[''REQUEST_SCHEME''] . ''://'' . $_SERVER[''HTTP_HOST''] . $_SERVER[''REQUEST_URI''];
$url_dir = preg_replace(''/[^//]+/.php(/?.*)?$/i'', '''', $url);
echo $url_dir;
la mejor manera es usar la función explotar / implosionar (PHP incorporado) como tal
$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$parts = explode(''/'',$actual_link);
$parts[count($parts) - 1] = "";
$actual_link = implode(''/'',$parts);
echo $actual_link;
php tiene muchas funciones para el análisis de cadenas que se pueden realizar con fragmentos de una línea simples
dirname () (que pediste) y parse_url () (que necesitas) están 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
la salida es
Request uri is: /do/index.php
Current dir is: /do/
dirname te 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 complicado, pero $_SERVER[''REQUEST_URI''] le devolverá la parte después del nombre de dominio (es decir, le dará "/do/index.php").
$_SERVER[''SERVER_NAME''] . dirname($_SERVER[''REQUEST_URI'']);