2008-10-06 11 views
10

Me gustaría encontrar la url base de mi aplicación, por lo que puedo hacer referencia automáticamente a otros archivos en mi árbol de aplicaciones ...¿Cómo puedo encontrar la URL base de una aplicación?

Me dieron un archivo config.php en la base de mi aplicación, si es un archivo en un subdirectorio lo incluye, sabe con qué prefijar una URL.

application/config.php 
application/admin/something.php 
application/css/style.css 

Así que teniendo en cuenta que se accede http://www.example.com/application/admin/something.php, quiero que sea capaz de saber que el archivo CSS está en $approot/css/style.css. En este caso, $approot es "/application", pero me gustaría saber si la aplicación está instalada en otro lugar.

No estoy seguro si es posible, muchas aplicaciones (phpMyAdmin, Squirrelmail, creo) tienen que establecer una variable de configuración para comenzar. Sería más fácil de usar si lo supiera.

Respuesta

15

Utilizo lo siguiente en un framework homebrew ... Ponlo en un archivo en la carpeta raíz de tu aplicación y simplemente inclúyelo.

define('ABSPATH', str_replace('\\', '/', dirname(__FILE__)) . '/'); 

$tempPath1 = explode('/', str_replace('\\', '/', dirname($_SERVER['SCRIPT_FILENAME']))); 
$tempPath2 = explode('/', substr(ABSPATH, 0, -1)); 
$tempPath3 = explode('/', str_replace('\\', '/', dirname($_SERVER['PHP_SELF']))); 

for ($i = count($tempPath2); $i < count($tempPath1); $i++) 
    array_pop ($tempPath3); 

$urladdr = $_SERVER['HTTP_HOST'] . implode('/', $tempPath3); 

if ($urladdr{strlen($urladdr) - 1}== '/') 
    define('URLADDR', 'http://' . $urladdr); 
else 
    define('URLADDR', 'http://' . $urladdr . '/'); 

unset($tempPath1, $tempPath2, $tempPath3, $urladdr); 

El código anterior define dos constantes. ABSPATH contiene la ruta absoluta a la raíz de la aplicación (sistema de archivos local) mientras que URLADDR contiene la URL completa de la aplicación. Funciona en situaciones mod_rewrite.

+0

Guau, eso parece funcionar. – DGM

+0

No, no lo hace. Devuelve la ruta del sistema de archivos físico y no la ruta de la URL. – Gumbo

+0

ABSPATH devuelve la ruta del sistema de archivos físico, URLADDR devuelve la URL completa de la aplicación. –

1

A menos que rastree esto usted mismo, no creo que esto tenga una definición. O más bien, le estás pidiendo a PHP que rastree algo que de alguna manera estás definiendo arbitrariamente.

En resumidas cuentas, si entiendo tu pregunta correctamente, no creo que exista lo que estás pidiendo, al menos no como PHP "central"; un marco dado puede proporcionar una URL "raíz" relativa a una estructura de directorio que es.

¿Tiene sentido?

2

El REQUEST_URI combinado con dirname() puede decirle a su directorio actual, relevante para la ruta URL:

<?php 
    echo dirname($_SERVER["REQUEST_URI"]); 
?> 

Así http://example.com/test/test.php impresiones "/ test" o http://example.com/ grabados "/" que se puede utilizar para generar enlaces a consulte otras páginas relativas a la ruta actual.

EDIT: acaba de darse cuenta al volver a leer que puede estar preguntando acerca de la ruta en el disco en lugar de la ruta de la URL. En ese caso, desea la función de PHP getcwd() lugar:

<?php 
    echo getcwd(); 
?> 
1

poner esto en su config.php (que está en directorio raíz de la aplicación):

$approot = substr(dirname(__FILE__),strlen($_SERVER['DOCUMENT_ROOT'])); 

creo que lo hará.

+0

que está cerca, pero no del todo. Creo que esto se arruina debido al aliasing del servidor. – DGM

+0

+1 para la matemática interesante. :) – DGM

+0

Ah, eso es cierto. Supongo que si esto funciona depende de la configuración de tu servidor. –

0

Una solución sería utilizar rutas de acceso relativas para todo, de esa manera no importa dónde está instalada la aplicación. Por ejemplo, para llegar a la hoja de estilo, utilice esto:

../css/style.css 
+2

El problema es que esto está en una plantilla, pero potencialmente llamado desde diferentes niveles, así que necesito saber a qué nivel llamar en función del script, o si no, necesito la URL completa – DGM

0

Si desea que la ruta del sistema de archivos que se pueden utilizar $_SERVER['DOCUMENT_ROOT']
Si lo que desea es la ruta del archivo que aparece en la URL después de la uso del dominio $_SERVER['REQUEST_URI']

0

Nunca he encontrado una manera de hacerlo.

Siempre termino estableciendo una variable de configuración con la ruta del servidor a un nivel superior a la raíz web.Entonces es:

  • $ configVar. 'public/whatever /' para cosas dentro de root,
  • pero también se puede incluir desde afuera con $ configVar. 'PhpInc/db.inc.php /' etc.
0

Esto funciona como un encanto para mí, en cualquier lugar despliego, con o sin reglas de reescritura:

$ BASEDIR = 'http: //'. $ _SERVER ['HTTP_HOST']. (Dirname ($ _ SERVER ['SCRIPT_NAME'])! = '/'? Dirname ($ _ SERVER ["SCRIPT_NAME"]). '/': '/');

+1

Esto se acerca, pero no se afeita fuera de los subdirectorios de la aplicación desde la url. Entonces, si estoy en http: //hostname/application/subfolder/test.php e incluyo un archivo en/aplicación que define esta variable, todavía tiene una subcarpeta en la url.Solo quiero/solicitud – DGM

+0

Pruebe la reescritura de URL. Simplemente reescriba todo en un index.php en/application/(excepto algunos recursos http por supuesto) Haga que index.php lo reenvíe a la subcarpeta correcta. – SchizoDuckie

+0

Habilitar mod_rewrite en Apache .htaccess en/application/ RewriteEngine En RewriteRule^includes/- [L] [O] #No se aplica a/O incluye imágenes RewriteRule ^/- [L] #No no se aplica a/images RewriteRule ^. * index.php #rewrite todo a index.php Parse $ _SERVER ['REQUEST_URI'] para su ruta! – SchizoDuckie

1

raíz URL de la aplicación se puede encontrar

$protocol = (strstr('https',$_SERVER['SERVER_PROTOCOL']) === false)?'http':'https'; 
$url = $protocol.'://'.$_SERVER['SERVER_NAME'].dirname($_SERVER['REQUEST_URI']); 

este código volverá ruta URL de cualquier aplicación ya sea estar en línea o en el servidor fuera de línea.

No he realizado la comprobación adecuada para el '/' correcto. Por favor modifíquelo para barras.

este archivo debe colocarse en la raíz.

ejemplo: url si aplicación:

http://localhost/test/test/test.php 

entonces este código volverá

http://localhost/test/test 

Gracias

5

puede encontrar la url base con el código folowing:

define('SITE_BASE_PATH','http://'.preg_replace('/[^a-zA-Z0-9]/i','',$_SERVER['HTTP_HOST']).'/'.str_replace('\\','/',substr(dirname(__FILE__),strlen($_SERVER['DOCUMENT_ROOT']))).'/'); 

Corto y mejor.

+0

Sugiero incluir un poco "." después de eso ".... 0-9" si quiere que funcione en direcciones IP también. ----> 'define ('SITE_BASE_PATH', 'http: //'.preg_replace ('/[^ a-zA-Z0-9.]/i ',' ', $ _ SERVER [' HTTP_HOST ']). '/'.str_replace('\\','/',substr(dirname(__FILE__),strlen($_SERVER['DOCUMENT_ROOT']))).'/'); ' –

+0

¿Por qué' str_replace ("\\" '?? – TCB13

0

Esto es lo que he usado en mi aplicación que funciona bien, también uso un puerto personalizado, así que tuve que permitir esto también.

define('DOC_URL', ($_SERVER['HTTPS']=='on'?'https':'http').'://'.$_SERVER['SERVER_NAME'].(!in_array($_SERVER['SERVER_PORT'], array(80,443))?':'.$_SERVER['SERVER_PORT']:'')).dirname($_SERVER['REQUEST_URI']); 

Entonces lo uso escribiendo lo siguiente ...

<img src="<?php echo DOC_URL; ?>/_img/logo.png" /> 
Cuestiones relacionadas