[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / ecrire / inc / headers.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13
14 if (!defined('_ECRIRE_INC_VERSION')) return;
15
16 // envoyer le navigateur sur une nouvelle adresse
17 // en evitant les attaques par la redirection (souvent indique par 1 $_GET)
18
19 // http://doc.spip.org/@redirige_par_entete
20 function redirige_par_entete($url, $equiv='', $status = 302) {
21 if (!in_array($status,array(301,302)))
22 $status = 302;
23
24 $url = trim(strtr($url, "\n\r", " "));
25 # en theorie on devrait faire ca tout le temps, mais quand la chaine
26 # commence par ? c'est imperatif, sinon l'url finale n'est pas la bonne
27 if ($url[0]=='?')
28 $url = url_de_base().$url;
29 if ($url[0]=='#')
30 $url = self('&').$url;
31 # si profondeur non nulle et url relative, il faut la passer en absolue
32 if ($GLOBALS['profondeur_url']>(_DIR_RESTREINT?1:2)
33 AND !preg_match(",^(\w+:)?//,",$url)){
34 include_spip("inc/filtres_mini");
35 $url = url_absolue($url);
36 }
37
38 if ($x = _request('transformer_xml'))
39 $url = parametre_url($url, 'transformer_xml', $x, '&');
40
41 if (defined('_AJAX') AND _AJAX)
42 $url = parametre_url($url, 'var_ajax_redir', 1, '&');
43
44 // ne pas laisser passer n'importe quoi dans l'url
45 $url = str_replace(array('<','"'),array('&lt;','&quot;'),$url);
46 // interdire les url inline avec des pseudo-protocoles :
47 if (
48 (preg_match(",data:,i",$url) AND preg_match("/base64\s*,/i",$url))
49 OR preg_match(",(javascript|mailto):,i",$url)
50 )
51 $url ="./";
52
53 // Il n'y a que sous Apache que setcookie puis redirection fonctionne
54 include_spip('inc/cookie');
55 if ((!$equiv AND !spip_cookie_envoye()) OR ((strncmp("Apache", $_SERVER['SERVER_SOFTWARE'],6)==0) OR defined('_SERVER_APACHE'))) {
56 @header("Location: " . $url);
57 $equiv="";
58 } else {
59 @header("Refresh: 0; url=" . $url);
60 $equiv = "<meta http-equiv='Refresh' content='0; url=$url'>";
61 }
62 include_spip('inc/lang');
63 if ($status!=302)
64 http_status($status);
65 echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">',"\n",
66 html_lang_attributes(),'
67 <head>',
68 $equiv,'
69 <title>HTTP '.$status.'</title>
70 </head>
71 <body>
72 <h1>HTTP '.$status.'</h1>
73 <a href="',
74 quote_amp($url),
75 '">',
76 _T('navigateur_pas_redirige'),
77 '</a></body></html>';
78
79 spip_log("redirige $status: $url");
80
81 exit;
82 }
83
84 // http://doc.spip.org/@redirige_formulaire
85 function redirige_formulaire($url, $equiv = '', $format='message') {
86 if (!_AJAX
87 AND !headers_sent()
88 AND !_request('var_ajax')) {
89 redirige_par_entete(str_replace('&amp;','&',$url), $equiv);
90 }
91 // si c'est une ancre, fixer simplement le window.location.hash
92 elseif($format=='ajaxform' AND preg_match(',^#[0-9a-z\-_]+$,i',$url)) {
93 return array(
94 // on renvoie un lien masque qui sera traite par ajaxCallback.js
95 "<a href='$url' name='ajax_ancre' style='display:none;'>anchor</a>",
96 // et rien dans le message ok
97 '');
98 }
99 else {
100 // ne pas laisser passer n'importe quoi dans l'url
101 $url = str_replace(array('<','"'),array('&lt;','&quot;'),$url);
102
103 $url = strtr($url, "\n\r", " ");
104 # en theorie on devrait faire ca tout le temps, mais quand la chaine
105 # commence par ? c'est imperatif, sinon l'url finale n'est pas la bonne
106 if ($url[0]=='?')
107 $url = url_de_base().$url;
108 $url = str_replace('&amp;','&',$url);
109 spip_log("redirige formulaire ajax: $url");
110 include_spip('inc/filtres');
111 if ($format=='ajaxform')
112 return array(
113 // on renvoie un lien masque qui sera traite par ajaxCallback.js
114 '<a href="'.quote_amp($url).'" name="ajax_redirect" style="display:none;">'._T('navigateur_pas_redirige').'</a>',
115 // et un message au cas ou
116 '<br /><a href="'.quote_amp($url).'">'._T('navigateur_pas_redirige').'</a>'
117 );
118 else // format message texte, tout en js inline
119 return
120 // ie poste les formulaires dans une iframe, il faut donc rediriger son parent
121 "<script type='text/javascript'>if (parent.window){parent.window.document.location.replace(\"$url\");} else {document.location.replace(\"$url\");}</script>"
122 . http_img_pack('searching.gif','')
123 . '<br />'
124 . '<a href="'.quote_amp($url).'">'._T('navigateur_pas_redirige').'</a>';
125 }
126 }
127
128 // http://doc.spip.org/@redirige_url_ecrire
129 function redirige_url_ecrire($script='', $args='', $equiv='') {
130 return redirige_par_entete(generer_url_ecrire($script, $args, true), $equiv);
131 }
132
133 // http://doc.spip.org/@http_status
134 function http_status($status) {
135 global $REDIRECT_STATUS, $flag_sapi_name;
136 static $status_string = array(
137 200 => '200 OK',
138 204 => '204 No Content',
139 301 => '301 Moved Permanently',
140 302 => '302 Found',
141 304 => '304 Not Modified',
142 401 => '401 Unauthorized',
143 403 => '403 Forbidden',
144 404 => '404 Not Found',
145 503 => '503 Service Unavailable'
146 );
147
148 if ($REDIRECT_STATUS && $REDIRECT_STATUS == $status) return;
149
150 $php_cgi = ($flag_sapi_name AND preg_match(",cgi,i", @php_sapi_name()));
151 if ($php_cgi)
152 header("Status: ".$status_string[$status]);
153 else
154 header("HTTP/1.0 ".$status_string[$status]);
155 }
156
157 // Retourne ce qui va bien pour que le navigateur ne mette pas la page en cache
158 // http://doc.spip.org/@http_no_cache
159 function http_no_cache() {
160 if (headers_sent())
161 { spip_log("http_no_cache arrive trop tard"); return;}
162 $charset = empty($GLOBALS['meta']['charset']) ? 'utf-8' : $GLOBALS['meta']['charset'];
163
164 // selon http://developer.apple.com/internet/safari/faq.html#anchor5
165 // il faudrait aussi pour Safari
166 // header("Cache-Control: post-check=0, pre-check=0", false)
167 // mais ca ne respecte pas
168 // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
169
170 header("Content-Type: text/html; charset=$charset");
171 header("Expires: 0");
172 header("Last-Modified: " .gmdate("D, d M Y H:i:s"). " GMT");
173 header("Cache-Control: no-cache, must-revalidate");
174 header("Pragma: no-cache");
175 }
176
177 ?>