2008-11-09 13 views
8

Estoy desarrollando un sitio web PHP que utiliza el enrutamiento url. Me gustaría que el sitio sea independiente del directorio, de modo que se pueda mover de http://site.example.com/ a http://example.com/site/ sin tener que cambiar todas las rutas en el HTML. El problema surge cuando estoy vinculando archivos que no están sujetos a enrutamiento, como archivos CSS, imágenes, etc. Por ejemplo, supongamos que la vista para la acción index del controlador welcome contiene la imagen img/banner.jpg. Si la página se solicita con la url http://site.example.com/welcome, el navegador solicitará la imagen como http://site.example.com/img/banner.jpg, lo cual está perfectamente bien. Pero si la página se solicita con la url http://site.example.com/welcome/index, el navegador pensará que welcome es un directorio e intentará buscar la imagen como http://site.example.com/welcome/img/banner.jpg, lo cual es obviamente incorrecto.Cómo mantener un sitio web con el directorio de enrutamiento url independiente

yo ya he considerado algunas opciones, pero todos parecen imperfecta a mí:

  • Uso reescritura de URL para redirigir las solicitudes a partir de (* .css | * .js | ...) o (css/* | js/* | ...) en la ruta correcta.

    Problemas: Cada extensión debería nombrarse en las reglas de reescritura. Si alguien agregara un nuevo tipo de archivo (por ejemplo, un archivo mp3), no sería reescrito.

  • Anteponga la ruta base a cada ruta relativa con una función php. Por ejemplo:
    <img src="<?php echo url::base(); ?>img/banner.jpg" />

    Problemas: Se ve desordenado; css - y js - los archivos que contienen rutas deberían procesarse por PHP.

Entonces, ¿cómo mantener un directorio de sitios web independiente? ¿Hay una manera mejor/más limpia que las que se me ocurrió?

Respuesta

8

se puede poner en la cabeza

<base href="<?php echo url::base(); ?>" /> 

Esto significará el navegador solicitará ninguna URL no absolutas relativas a ese camino. Sin embargo, no estoy seguro de cómo afectaría esto a las URL incrustadas en archivos CSS, etc. Esto no afecta a las rutas definidas en los archivos CSS. (gracias mooware)

+0

De acuerdo con la especificación CSS, las URL en los archivos CSS se resuelven en relación con la ruta del archivo en el que están definidas. Por lo tanto, la etiqueta base no les afecta en absoluto. Lo intenté, y realmente funciona de esa manera. – mooware

1

tomhaigh tiene un buen punto, y valdría la pena investigarlo más a fondo.

Según MSDN, la etiqueta base funciona para todas las fuentes, incluyendo las hojas de estilo, imágenes, etc.

1

Tal vez me falta algo, pero no puedes hacer lo que (y pensé que todo el mundo else) do/es? Es decir, poner todas sus imágenes, css, javascript, etc es decir en un directorio común .:

/inc/images/ 
/inc/css/ 
/inc/javascript/ 
etc 

Y luego hacer referencia a ellos con la URL base-relativa, es decir,:

<img src="/inc/images/foo.jpg" /> 
etc 

?

2

La cosa <base> funcionará, pero debe recordar que va a afectar a sus etiquetas <a> también. Considere este ejemplo .:

<!-- this page is http://oursite.com/index.html --> 
<html> 
<head> 
    <base href="http://static.oursite.com/" /> 
</head> 
<body> 
    <img src="logo.gif" alt="this is http://static.oursite.com/logo.gif" /> 
    <a href="/login">this links to http://static.oursite.com/login which is not what we wanted. we wanted http://oursite.com/login</a> 
</body> 
</html> 

Si utiliza una llamada a la función PHP para la creación de sus enlaces, que no será un problema, ya que sólo puede asegurarse de que escupe URL absoluta. Pero si usted (o sus diseñadores) codifican manualmente las etiquetas <a>, entonces se encontrará nuevamente con el mismo problema, ahora con <a> en lugar de <img>.

EDITAR: Debo añadir que el párrafo anterior supone que sirve imágenes de un nombre de host diferente como lo hacemos nosotros. Si no lo hace, obviamente eso no será un problema.

+0

Fue muy útil, al señalar un subdominio a un nuevo subdirectorio, utilicé '' base href = ... 'y me salvó de personalizar las rutas .js y .css y escribir una redirección de php. –

Cuestiones relacionadas