dem ein oder anderen ist es eventuell schon aufgefallen, dass man sich hin und wieder entscheiden muss, ob man mit sessions arbeitet oder den output mit gzencode komprimiert
verwendet man gzencode dann bekommt man einen komprimierten binären string in dem php nicht mehr nach relativen urls suchen kann, die ggf. um die session-id erweitert werden müssen.
abhilfe schafft das hier (kurz getestet, scheint zu funktionieren):
|
PHP-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
function add_sid($do_output = false) {
if (!$do_output) { //output buffering starten
ob_start();
ob_start('add_sid');
}
else { //SID anhängen
// eigene url ermitteln
$own_url = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
$own_url .= $_SERVER['HTTP_HOST'];
$content = preg_replace('%<a([^>]+)href="([^>"\s]+)"%ie',
'"<a$1href=\"" . absolute("$2", $own_url) . "\""',
$do_output);
return $content;
}
}
function get_content() { // um SID erweiterten inhalt liefern
ob_end_flush();
$content = ob_get_contents();
ob_end_clean();
return $content;
}
function absolute ($relative, $absolute) { //relative urls um SID erweitern
if (preg_match('%^(https?://|[URL]ftp://[/URL]|mailto:|news:)%i', $relative)
// url ist schon absolut
and !preg_match('%^('.$absolute.')%i', $relative))
//und verweist nicht auf eigene domain
return $relative;
if (strlen(SID) == 0)
return $relative; // keine session gestartet oder cookie vorhanden
//url bearbeiten
$url = parse_url($absolute);
if ($url['path']{strlen($url['path']) - 1} == '/')
$dir = dirname(substr($url['path'], 0, strlen($url['path']) - 1));
else
$dir = dirname($url['path']);
if ($relative{0} == '/') { //link auf startseite (domain)
$relative = substr($relative, 1);
$dir = '';
}
elseif (substr($relative, 0, 2) == './') //link auf aktuelles verzeichnis
$relative = substr($relative, 2);
else while (substr($relative, 0, 3) == '../') { //pfadangaben verarbeiten
$relative = substr($relative, 3);
$dir = substr($dir, 0, strrpos($dir, '/'));
}
$relative = parse_url($relative);
if (!empty($relative['query'])) //es gibt schon parameter, SID anhängen
$relative = $relative['path'].'?'.$relative['query'].'&'.SID;
else
$relative = $relative['path'].'?'.SID;
return sprintf('%s://%s%s/%s', $url['scheme'], $url['host'], $dir, $relative);
}
|
der aufruf ist denkbar einfach:
|
PHP-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php
session_start();
add_sid();
echo '<a href="a.php?a=b">a</a>';
?>
<a href="?x=y">Test</a>
<?php
echo '<a href="a.php">b</a>';
$content = get_content();
?>
|
$content enthält jetzt den kompletten output, wo die session-id angehängt werden musste, wurde sie auch angehängt
momentan werden nur links ersetzt, alternativ könnte man add_sid dahingehen erweitern, dass man auch img-tags erweitert (soll ja manchmal nötig sein), aber das sollte jetzt ja nicht mehr so schwer sein