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'']);