Valider f98e75c9 rédigé par cedric@yterium.com's avatar cedric@yterium.com
Parcourir les fichiers

Amelioration : on peut definir une URL statique pour servir les ressources...

Amelioration : on peut definir une URL statique pour servir les ressources (images, js) sans cookie.
L'URL definie est alors utilisee pour les images contenues dans les CSS minifiees, et dans le HTML des pages servies, sans modification du squelette.
On n'utilise pas cette URL pour servir la CSS minifiee car celle-ci est prefetch avec une header http link, et la servir sur un domaine different retarde son arrivee car il faut une requete DNS en plus.
parent a1dd4375
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+21 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -79,6 +79,26 @@ function compresseur_affiche_milieu($flux) {
	return $flux;
}


/**
 * Transformer toutes les URLs relatives image,js en url absolues qui pointent sur le domaine statique
 * on applique pas a l'URL de la CSS, car on envoie un header http link qui permet au navigateur de la pre-fetch
 * sur le meme domaine, sans avoir a faire de requete DNS
 * @param string $flux
 * @return string
 */
function compresseur_affichage_final($flux) {
	if (isset($GLOBALS['meta']['url_statique_ressources'])
	  and isset($GLOBALS['html'])
	  and $GLOBALS['html']
	  and $url_statique = $GLOBALS['meta']['url_statique_ressources']){
		$url_statique = rtrim(protocole_implicite($url_statique), "/") . "/";
		$flux = preg_replace(",(href|src)=([\"'])([^/][^:\"']*[.](?:png|gif|jpg|js)(?:\?[0-9]+)?)\\2,Uims","\\1=\\2".$url_statique."\\3\\2",$flux);
	}

  return $flux;
}

/**
 * Lister les metas du compresseur et leurs valeurs par défaut
 *
@@ -92,6 +112,7 @@ function compresseur_configurer_liste_metas($metas) {
	$metas['auto_compress_js'] = 'non';
	$metas['auto_compress_closure'] = 'non';
	$metas['auto_compress_css'] = 'non';
	$metas['url_statique_ressources'] = '';

	return $metas;
}
+11 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -7,6 +7,17 @@
	<form action="#ENV{action}#formulaire_configurer_compresseur" method="post"><div>
		[(#ACTION_FORMULAIRE{#ENV{action}})]
		<div class="editer-groupe">
			#SET{name,url_statique_ressources}#SET{obli,''}#SET{defaut,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
			<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
				<label for="#GET{name}"><:compresseur:label_url_statique_ressources:></label>[
				<span class='erreur_message'>(#GET{erreurs})</span>
				]<input type="text" name="#GET{name}" class="text" value="#ENV*{#GET{name},#GET{defaut}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
				<p class="explication"><:compresseur:explication_url_statique_ressources:></p>
				<style>
					.editer_url_statique_ressources input.text{padding-right: 32px;background-image: none;}
					.editer_url_statique_ressources input.text{background-position: right center;background-repeat: no-repeat; background-image:url([(#CHEMIN_IMAGE{ok-24.png}|url_absolue{#ENV*{#GET{name},#GET{defaut}}|sinon{#URL_SITE_SPIP}|concat{'/',#EVAL{_DIR_RACINE?_DIR_RESTREINT_ABS:''}}})]);}
				</style>
			</div>
			<div class='fieldset'>
				<fieldset>
					<legend><:compresseur:titre_compacter_script_css:></legend>
+12 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -32,6 +32,7 @@ function formulaires_configurer_compresseur_charger_dist() {
	$valeurs['auto_compress_js'] = $GLOBALS['meta']['auto_compress_js'];
	$valeurs['auto_compress_css'] = $GLOBALS['meta']['auto_compress_css'];
	$valeurs['auto_compress_closure'] = $GLOBALS['meta']['auto_compress_closure'];
	$valeurs['url_statique_ressources'] = $GLOBALS['meta']['url_statique_ressources'];

	return $valeurs;

@@ -53,6 +54,17 @@ function formulaires_configurer_compresseur_verifier_dist() {
		}
	}

	if ($url = _request('url_statique_ressources')){
		$url = preg_replace(",/?\s*$,", "", $url);
		if (!tester_url_absolue($url)) {
			$protocole = explode('://',$GLOBALS['meta']['adresse_site']);
			$protocole = reset($protocole);
			$url = $protocole . "://$url";
		}
		set_request('url_statique_ressources',$url);
	}


	return $erreurs;
}

+28 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -195,6 +195,10 @@ function compacte_head_files($flux, $format) {
		// puisque la css compresse inclue l'url courante du site (en url absolue)
		// on exclue le protocole car la compression se fait en url relative au protocole
		$callbacks[] = protocole_implicite($url_base);
		// et l'URL des ressources statiques si configuree
		if (isset($GLOBALS['meta']['url_statique_ressources']) and $GLOBALS['meta']['url_statique_ressources']){
			$callbacks[] = protocole_implicite($GLOBALS['meta']['url_statique_ressources']);
		}
	}
	if ($format == 'js' and $GLOBALS['meta']['auto_compress_closure'] == 'oui') {
		$callbacks['all_min'] = 'minifier_encore_js';
@@ -230,7 +234,7 @@ function compresseur_liste_fonctions_prepare_css() {
	static $fonctions = null;

	if (is_null($fonctions)) {
		$fonctions = array('css_resolve_atimport', 'urls_absolues_css');
		$fonctions = array('css_resolve_atimport', 'urls_absolues_css', 'css_url_statique_ressources');
		// les fonctions de preparation aux CSS peuvent etre personalisees
		// via la globale $compresseur_filtres_css sous forme de tableau de fonctions ordonnees
		if (isset($GLOBALS['compresseur_filtres_css']) and is_array($GLOBALS['compresseur_filtres_css'])) {
@@ -346,9 +350,10 @@ function &compresseur_callback_prepare_css_inline(&$contenu, $url_base, $filenam
 *
 * @param string $contenu
 * @param string $url_base
 * @param string $filename
 * @return string
 */
function css_resolve_atimport($contenu, $url_base) {
function css_resolve_atimport($contenu, $url_base, $filename) {
	// vite si rien a faire
	if (strpos($contenu, "@import") === false) {
		return $contenu;
@@ -439,3 +444,24 @@ function css_regroup_atimport($nom_tmp, $nom) {

	return $nom;
}

/**
 * Remplacer l'URL du site par une url de ressource genre static.example.org
 * qui evite les echanges de cookie pour les ressources images
 * (peut aussi etre l'URL d'un CDN ou autre provider de ressources statiques)
 *
 * @param string $contenu
 * @param string $url_base
 * @param string $filename
 * @return mixed
 */
function css_url_statique_ressources($contenu, $url_base, $filename){

	if (isset($GLOBALS['meta']['url_statique_ressources'])
	  and $url_statique = $GLOBALS['meta']['url_statique_ressources']) {
		$url_statique = rtrim(protocole_implicite($url_statique),"/")."/";
		$url_site = rtrim(protocole_implicite($GLOBALS['meta']['adresse_site']),"/")."/";
		$contenu = str_replace($url_site, $url_statique, $contenu);
	}
	return $contenu;
}
+4 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -15,6 +15,10 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
	'item_compresseur_css' => 'Activer la compression des feuilles de style (CSS)',
	'item_compresseur_js' => 'Activer la compression des scripts (javascript)',

	// L
	'label_url_statique_ressources' => 'URL ressources',
	'explication_url_statique_ressources' => 'Une URL qui permet de servir les fichiers statiques (images, CSS…) sans cookie. Généralement un sous-domaine alternatif qui pointe aussi sur le site.',

	// T
	'texte_compacter_avertissement' => 'Attention à ne pas activer ces options durant le développement de votre site : les éléments compactés perdent toute lisibilité.',
	'texte_compacter_script_css' => 'SPIP peut compacter les scripts javascript et les feuilles de style CSS, pour les enregistrer dans des fichiers statiques ; cela accélère l’affichage du site.',
Chargement en cours