PHP Redirect
15. Januar 2010 | In: Php
PHP Redirects von Domains sind ein alter Hut. Während man Domains ohne Sonderzeichen problemlos mittels header(‘Location: …’); oder Meta-Refresh umleiten kann, hat man bei Sonderzeichen in Domainnamen ein Problem.
Der Meta-Refresh funktioniert zwar noch immer, der Redirect mittels header(‘Location: …’); aus PHP heraus leider nicht.
Die folgende Funktion zerlegt die Url’s in ihre Bestandteile, dann wird der Hostname in Punnycode codiert und die Url wieder zusammengbaut.
Der Aufruf von idn_redirect(‘http://www.öko.de/’); leitet auf http://www.xn--ko-eka.de/
function idn_redirect($url, $permanent = true) { include_once 'Net/IDNA.php'; $idn = Net_IDNA::getInstance(); $tokens = parse_url($url); $target = $tokens['scheme'] . '://'; if(array_key_exists('user', $tokens) && array_key_exists('pass', $tokens)) { $target .= $tokens['user']. ':'. $tokens['pass']. '@'; } try { $host = $idn->encode($tokens['host']); } catch(Exception $ex) { } if(isset($host)) { $target .= $host; } else { $target .= $tokens['host']; } if(array_key_exists('port', $tokens) && !empty($tokens['port'])) { $target .= ':'. $tokens['port']; } if(array_key_exists('path', $tokens) && !empty($tokens['path'])) { $target .= $tokens['path']; } if(array_key_exists('query', $tokens) && !empty($tokens['query'])) { $target .= '?'. $tokens['query']; } if(array_key_exists('fragment', $tokens) && !empty($tokens['fragment'])) { $target .= '#'. $tokens['fragment']; } if(!headers_sent()) { if($permanent) { header('HTTP/1.1 301 Moved permanently.'); } header('Location: ' . $target); } else { printf('<html><head><meta http-equiv="refresh" content="0;URL=%s"></meta></head><body><a href="%s">%s</a></body></html>', $target, $target, $target); } exit; } |
Die Funktion nutzt die IDN-Funktionen von http://pecl.php.net/package/idn.

Schreib einen Kommentar
Fülle das Kommentar-Formular vollständig aus oder melde dich über Twitter oder Facebook an.