URL dinámicas en CSS/JS
-
21-08-2019 - |
Pregunta
Estoy dividiendo una de mis aplicaciones más grandes e introduciendo una URL 'cdn' para albergar objetos comunes como CSS, javascript e imágenes para evitar duplicaciones.Sin embargo, lo que necesito hacer es tener URL separadas para nuestros entornos de desarrollo, por lo que es posible que tenga:
http://cdn-dev.example.com
http://cdn-qua.example.com
http://cdn.example.com
dependiendo del entorno en el que estemos trabajando.Puedo hacer que esto funcione para cosas generadas por nuestro código PHP, pero no sé qué archivos .css y .js se llamarán.Por ejemplo, ¿cómo hago algo como:
.cool-button { background-image: url('http://cdn.example.com/images/button.png'); }
¿Cambiar entre los diferentes dominios?
¿Cuál es la mejor manera de lidiar con eso?
[EDITAR]
Para que todos queden claro, la dirección CDN es un dominio diferente al sitio.Entonces, el sitio de desarrollo podría ser http://www-dev.dominio.com cual usaria http://cdn-dev.dominio.com
Solución
Usar rutas relativas, no rutas absolutas. Cuando dentro de un archivo CSS, la ruta es relativa al archivo CSS y no la página HTML.
Si el archivo CSS es aquí
http://cdn.example.com/css/style.css
Y su clase es
.cool-button { background-image: url('../images/button.png'); }
A continuación, el navegador intentará cargar la imagen desde
http://cdn.example.com/images/button.png
Otros consejos
Sólo tiene que utilizar la URL del dominio relativo?
.cool-button { background-image: url('/images/button.png'); }
A continuación, el navegador buscará bajo el dominio actual.
También puede tener un proceso de construir y utilizar plantillas para generar archivos específicos de entorno
por ejemplo. en un archivo llamado yoursite.template.css
.cool-botón {Imagen de fondo: url ( '@@ @@ URL / images / button.png'); }
crear el archivo yoursite.css que reemplace @@ @@ URL con el dominio que desea.
En función de la configuración del servidor, también se puede añadir el php-extensión a los nombres de archivo y hacer que se trata como scripts PHP también:
I.E.: style.css.php would contain:
.cool-button { background-image url(<?php echo $bgImgUrl;?>); }
Esto también funciona para JavaScript-archivos.
He literalmente a estado trabajando en la misma cosa hoy y esto es lo que ocurrió.
Pegue esto en su archivo .htaccess en la raíz de su sitio. Esto se basa obviamente en Apache y Mod_rewrite.
RewriteEngine on
RewriteBase /
# Redirect content to the CDN
RewriteCond %{HTTP_HOST} !^cdn\.server\.com$ [NC]
RewriteRule .*\.(jpg|gif|png|flv|css|js|swf)$ http://cdn.server.com/$0 [R=301,L]
Esto enviará las solicitudes de los tipos de archivo de los soportes a su cdn y mantener las solicitudes de otros tipos en el servidor primario.
Buscando una respuesta a esto también, vi una simple:cree su archivo css con clases duplicadas, una para el escenario 1 (las imágenes se cargan desde el mismo dominio) y otra para el escenario 2 (las imágenes se cargan desde CDN).
p.ej.
.container {background-image:url(my/site/image.png;)}
.container-CDN {background-image:url(http://my.site.cdn.com/image.png;)}
Luego, en tu index.php, introduce PHP para llamar a la clase correcta.
p.ej.
<body class="container<?PHP if ($whatever) {echo "-CDN";} ?>">
Si el servidor es el mismo, puede utilizar rutas relativas. Al igual que /http/blah/test/images/button.png o ../ images / button.png
Al utilizar URLs relativas, puede forzar una URL "base". En la etiqueta
, utilicePara referencia: http://www.w3schools.com/TAGS/tag_base.asp
Bueno ... la solución que se me ocurrió fue ... ... sorta hacker, fea y tonta. Pero, demonios, funcionó:
<?php
if ($_SERVER['SERVER_NAME'] == "www.domain.tld") {
$incs_path = "/usr/local/psa/home/vhosts/domain.tld/non-web-root-folder/private-files";
}
else {
$incs_path = "incs";
}
require_once "$incs_path/$file-to-be-called.inc";
?>
Esto es, como se ha señalado, hacky y feo y se podría hacer mucho más bajitos. Pero sí, al menos, permiten definir lugares específicos para grupos específicos de archivos dependiendo del huésped.