Hilfe - Suche - Mitglieder - Kalender
Vollansicht: Weiterleitung mit Features
Forum Sefrengo.org > Downloads > Hacks/ Sonstiges
STam
Ich hatte ein Problem damit eine interne Weiterleitung mit Weitergabe des Query-Strings zu realisieren.
Letztlich kam ich zu diesem Feature, nämlich in der Weiterleitung (Input-Feld) verschiedene
Variablen zu parsen:
  1. {%cat} - wird mit $con_tree[1234]['link'] ersetzt
  2. {%side} - wird mit $con_side[1234]['link'] ersetzt (default)
  3. {%http_host} - wird mit $cfg_client['htmlpath'] ersetzt
  4. {%request_uri} - wird mit base64_encode($_SERVER['REQUEST_URI']) ersetzt
  5. {%query_string} - wird mit preg_replace('/sf_rewrite=[^&]*&/i','',$_SERVER['QUERY_STRING']) ersetzt
  6. {%status_301} - wird mit 'Status: 301 Moved Permanently' ersetzt
  7. {%status_302} - wird mit 'Status: 302 Moved Temporarily' ersetzt (default)
Das {%status_301} hatte ich nötig um alte URL's (aus dem Google-Cache) adäquat zu behandeln.
Die Besonderheit bei {%query_string} ergibt sich dadurch das über den Redirect ansonsten das
angehängte sf_rewrite= (bei ModeRewrite=2)einen Loop produziert!

In der Backend-Datei projektxy/cms/inc/backend.php musste zusätzlich
zum sf_rewrite= verhindert werden das ein extra view= einen Loop produziert!

Beispiel Eingaben für Weiterleitung:
QUELLTEXT
11
-> Weiterleitung zur Idcatside 11 mit default Header 'Status: 302 Moved Temporarily' (alte Funktionalität)
QUELLTEXT
11{%cat}
-> Weiterleitung zur Idcat 11 mit default Header 'Status: 302 Moved Temporarily'
QUELLTEXT
22{%side}
-> Weiterleitung zur Idcatside 22 mit default Header 'Status: 302 Moved Temporarily'
QUELLTEXT
22{%status_301}
-> Weiterleitung zur Idcatside 22 mit Header 'Status: 301 Moved Permanently'
QUELLTEXT
33{%status_302}{%query_string}
-> Weiterleitung zur Idcatside 33 mit Header 'Status: 302 Moved Temporarily' und angehängtem $_SERVER['QUERY_STRING']
QUELLTEXT
33{%status_301}{%cat}
-> Weiterleitung zur Idcat 33 mit Header 'Status: 301 Moved Permanently'
QUELLTEXT
{%http_host}forum.php{%query_string}
-> Weiterleitung zum Forum (forum.php) mit default Header 'Status: 302 Moved Temporarily' und angehängtem $_SERVER['QUERY_STRING']
QUELLTEXT
{%http_host}request.php?{%request_uri}
-> Weiterleitung zur request.php mit default Header 'Status: 302 Moved Temporarily' und angehängtem $_SERVER['REQUEST_URI']
QUELLTEXT
http://www.domain.de/request.php?foo={%request_uri}{%query_string}
-> Weiterleitung zur www.domain.de/request.php mit default Header 'Status: 302 Moved Temporarily' und angehängtem $_SERVER['REQUEST_URI'] und angehängtem $_SERVER['QUERY_STRING']

... ab hier Hack!?

hier meine Änderungen (frontend.php - erste und letzte Zeile Original):
CODE
// Seite weiterleiten?
if ($con_side[$idcatside]['meta_redirect'] == '1' && $con_side[$idcatside]['meta_redirect_url'] != '') {
$redirect = '';
$meta_redirect_url = $con_side[$idcatside]['meta_redirect_url'];
if (strpos($meta_redirect_url, '{%status_301}') !== false) $status = 'Status: 301 Moved Permanently';
else $status = 'Status: 302 Moved Temporarily';
$apend_query = (strpos($meta_redirect_url, '{%query_string}') !== false) ? true : false;
$con_side_or_tree = (strpos($meta_redirect_url, '{%cat}') !== false) ? 'con_tree' : 'con_side';
$meta_redirect_url = trim(str_replace(array('{%status_302}', '{%status_301}', '{%query_string}', '{%cat}', '{%side}'), array('', '', '', '', ''), $meta_redirect_url));
if (is_numeric($meta_redirect_url)) {
$con_side[$idcatside]['meta_redirect_url'] = ${$con_side_or_tree}[$meta_redirect_url]['link'];
if ($cfg_client['url_rewrite'] == '1') {
$con_side[$idcatside]['meta_redirect_url'] = preg_replace($cfg_client['url_rewrite_in'], $cfg_client['url_rewrite_out'], $con_side[$idcatside]['meta_redirect_url']);
} else if ($cfg_client['url_rewrite'] == '2') {
$con_side[$idcatside]['meta_redirect_url'] = preg_replace_callback($cfg_client['url_rewrite_in'], rewriteHandle, $con_side[$idcatside]['meta_redirect_url']);
}
$redirect = $cfg_client['htmlpath'] . $con_side[$idcatside]['meta_redirect_url'];
} else {
if (strpos($meta_redirect_url, 'http://{%http_host}') !== false && strpos($cfg_client['htmlpath'], 'http://') !== false) $meta_redirect_url = str_replace('http://', '', $meta_redirect_url);
$redirect = str_replace(array('{%http_host}', '{%request_uri}'), array($cfg_client['htmlpath'], base64_encode($_SERVER['REQUEST_URI'])), $meta_redirect_url);
}
// strip last ?/&
$redirect = ereg_replace( "(&|\?)+$", '', $redirect );
if ($apend_query) {
$redirect .= ((strpos($redirect, '?') !== false) ? '&' : '?') . preg_replace('/sf_rewrite=[^&]*&/i','',$_SERVER['QUERY_STRING']);
}
header("$status");
$redirect = str_replace('&', '&', $redirect);
header ('Location:' . $redirect );
// throw out side
} else ...

hier meine Änderungen (backend.php - erste und letzte Zeile Original):
CODE
//redirect is active
if($con_side[$idcatside]['meta_redirect'] == '1' && $con_side[$idcatside]['meta_redirect_url'] != '') {
$redirect = '';
$meta_redirect_url = $con_side[$idcatside]['meta_redirect_url'];
if (strpos($meta_redirect_url, '{%status_301}') !== false) $status = 'Status: 301 Moved Permanently';
else $status = 'Status: 302 Moved Temporarily';
$apend_query = (strpos($meta_redirect_url, '{%query_string}') !== false) ? true : false;
$con_side_or_tree = (strpos($meta_redirect_url, '{%cat}') !== false) ? 'con_tree' : 'con_side';
$meta_redirect_url = trim(str_replace(array('{%status_302}', '{%status_301}', '{%query_string}', '{%cat}', '{%side}'), array('', '', '', '', ''), $meta_redirect_url));
if (is_numeric($meta_redirect_url)) {
$con_side[$idcatside]['meta_redirect_url'] = ${$con_side_or_tree}[$meta_redirect_url]['link'];
$redirect = $cfg_client['htmlpath'] . $con_side[$idcatside]['meta_redirect_url'];
} else {
if (strpos($meta_redirect_url, 'http://{%http_host}') !== false && strpos($cfg_client['htmlpath'], 'http://') !== false) $meta_redirect_url = str_replace('http://', '', $meta_redirect_url);
$redirect = str_replace(array('{%http_host}', '{%request_uri}'), array($cfg_client['htmlpath'], base64_encode($_SERVER['REQUEST_URI'])), $meta_redirect_url);
}
// strip last ?/&
$redirect = ereg_replace( "(&|\?)+$", '', $redirect );
if ($apend_query) {
$pattern = array("/sf_rewrite=[^&]*&/i", "/&view=[^&]*/i");
$replace = array('', '');
$redirect .= ((strpos($redirect, '?') !== false) ? '&' : '?') . preg_replace($pattern, $replace, $_SERVER['QUERY_STRING']);
}
header("$status");
$redirect = str_replace('&', '&', $redirect);
header ('Location:' . $redirect );
}
// throw out side
else ...


Gruß

Edited:
# replace sf_header_redirect
P.S.: ist das hier richtig, oder muss das in 'Hacks' oder muss ich das Teilen (Anfrage hier -> Lösung Hacks)?
saschapi
Ui, das ist fein... smile.gif
alexander
moved - bei bedarf als FR mit link hierher posten.
Dieses ist eine vereinfachte Darstellung unseres Foreninhaltes. Um die detaillierte Vollansicht mit Formatierung und Bildern zu betrachten, bitte hier klicken.
Invision Power Board © 2001-2024 Invision Power Services, Inc.