zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden Weiterleitung von http://beispiel.de zu http://www.beispiel.de

Antwort
 
LinkBack Themen-Optionen Ansicht
  #11 (permalink)  
Alt 14.07.2006, 23:52
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 13.07.2006
Beiträge: 745
mermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblick
Standard

Hier mal ein Auszug aus dem Inhalt der $_SERVER-Variable vom Server meiner Seite:

Code zur Ausgabe:

PHP-Code:
echo '<pre>';
print_r($_SERVER);
echo 
'</pre>'
Auszug:

Code:
    [REQUEST_URI] => /sandbox/css/clipboard/php/rewrite/
    [SERVER_NAME] => electronic-alcatraz.de
Das sind die Felder, mit denen gearbeitet werden muss, um die Weiterleitung zu bewerkstelligen.

Angenommen wir sind aktuell hier: http://electronic-alcatraz.de/sandbo...d/php/rewrite/ (Da könntest du mal testweise draufklicken.)

Und wollen hierhin:
http://www.electronic-alcatraz.de/sa...d/php/rewrite/ (Da solltest du dann landen.)

Die Zeile

PHP-Code:
if (!(substr($_SERVER['SERVER_NAME'], 04) == 'www.')) { 
besagt im Klartext:

Wenn NICHT der Wert von $_SERVER['SERVER_NAME'] beginnend bei Offset 0 (Stringanfang) mit der Länge von 4 Zeichen der Zeichenkette "www." entspricht, dann...

Augenfällig ist das im obigen Beispiel der Fall, da die ersten vier Zeichen von $_SERVER['SERVER_NAME'] eben "elec" lauten.

Sollte im Browser bereits eine mit "www." beginnende URL aufgerufen worden sein, würde sich das in $_SERVER['SERVER_NAME'] niederschlagen: "www.electronic-alcatraz.de".

In diesem Fall muss natürlich nicht weitergeleitet werden, was durch die if-Bedingung geregelt wird.

Das Problem bei einer Subdomain ist mit diesem Script nun, dass die Adresse http://blog.electronic-alcatraz.de/ als $_SERVER['SERVER_NAME'] = 'blog.electronic-alcatraz.de' auftauchen würde.

Die ersten vier Zeichen wären also "blog", was nicht "www." ist, sodass die if-Bedingung ausgeführt und auf http://www.blog.electronic-alcatraz.de/ umleiten würde.

Mit einer modifizierten Version dieses Abfrageskripts ließe sich das beheben, aber erstmal sollte es auch so reichen. (Der Algorithmus dürfte nicht zu kompliziert sein, aber ich habe im Moment keine Möglichkeit das zu testen und bin mir nicht aller etwaiger Komplikationen bewusst.)

Der vollständige Code der Rewrite-Seite sieht übrigens so aus:

Code:
<?php
if (!(substr($_SERVER['SERVER_NAME'], 0, 4) == 'www.')) {
	header('Location: http://www.' . $_SERVER['SERVER_NAME'] 
			. $_SERVER['REQUEST_URI']);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>PHP Header-Rewrite</title>
</head>

<body>
<h1>PHP Header-Rewrite</h1>
</body>
</html>
Wo du deine zusätzlichen header()-Anweisungen aus dem vorherigen Post einträgst, dürfte übrigens absolut egal sein. (Solange sie zwischen <?php und ?> und außerhalb der Bedingung stehen natürlich.)
Mit Zitat antworten
Sponsored Links
  #12 (permalink)  
Alt 15.07.2006, 09:31
Benutzerbild von Gumbo
XHTMLforum-Kenner
 
Registriert seit: 22.08.2004
Ort: Trier
Beiträge: 2.733
Gumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekannt
Standard

Zusätzlich solltest du noch den Status-Code ändern und den Query String anhängen:
Code:
header('Location: http://www.'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'].(trim($_SERVER['QUERY_STRING'])!='' ? '?'.$_SERVER['QUERY_STRING'] : ''), true, 301);
__________________
Markus Wulftange
Mit Zitat antworten
Sponsored Links
  #13 (permalink)  
Alt 15.07.2006, 10:30
Benutzerbild von netspy
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 13.08.2004
Ort: Leipzig
Beiträge: 1.953
netspy sorgt für eine eindrucksvolle Atmosphärenetspy sorgt für eine eindrucksvolle Atmosphäre
Standard

Ich hab das ganze mal noch etwas abgeändert und erweitert. Jetzt wird auch noch eine entsprechende HTML-Seite mit ausgegeben, die besonders für Suchmaschinen interessant ist, die einen 301er nicht verstehen.

PHP-Code:
<?php

if (isset($_SERVER['HTTP_HOST']) && stripos($_SERVER['HTTP_HOST'], 'www') !== 0) {

  
header('Location: http://www.'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], true301);

?>

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="<?php print('http://www.'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); ?> ">here</a>.</p>
<hr>
<?php if (isset($_SERVER['SERVER_SIGNATURE'])) print($_SERVER['SERVER_SIGNATURE']) ?>
</body></html>

<?php

  
exit;

}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>PHP Header-Rewrite</title>
</head>

<body>
<h1>PHP Header-Rewrite</h1>
</body>
</html>
@Gumbo: der Query String ist schon in REQUEST_URI mit drin, darf also nicht noch mal mit angehangen werden.

Mario
__________________
AppDev Blog · AppDev Forum

Geändert von netspy (15.07.2006 um 10:33 Uhr)
Mit Zitat antworten
  #14 (permalink)  
Alt 15.07.2006, 18:45
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 13.07.2006
Beiträge: 745
mermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblick
Standard

stripos() ist allerdings erst ab PHP5 verfügbar.

Ich habe mich nochmal drangesetzt und die Geschichte (aufbauend auf dem letzten Post von netspy) in einer Klasse gekapselt:

Hinweis: Bei PHP-Code verzichte ich grundsätzlich auf die umgebenden Tags <?php ... ?>. Die müssten natürlich hinzugefügt werden.

inc.redirect.php

PHP-Code:
/**
 * RedirectEngine
 *
 * Automated redirect behaviour via HTTP_HOST.
 *
 * @author Marc Ermshaus <marc.ermshaus@gmx.de>
 */
class RedirectEngine {

    var 
$m_responseCode 301;
    var 
$m_hostRules = array();

    function 
run() {
        if (isset(
$_SERVER['HTTP_HOST'])) {        
            
$uri $this->_getRedirectUri();    
            if (
$uri) {
                
$this->_sendHeader($uri);
                
$this->_printPage($uri);
                exit;    
            }
        }
    }
    
    function 
_getRedirectUri() {    
        if (isset(
$this->m_hostRules[$_SERVER['HTTP_HOST']])) {
            return 
'http://' $this->m_hostRules[$_SERVER['HTTP_HOST']] . $_SERVER['REQUEST_URI'];
        } else {
            return 
false;
        }
    }
    
    function 
_sendHeader($uri) {
        
header('Location: ' $uritrue$this->m_responseCode);
    }
    
    function 
addHostRule($host$newHost) {
        
$this->m_hostRules[$host] = $newHost;
    }
    
    function 
_printPage($uri) {    
        
        switch (
$this->m_responseCode) {
        
            case 
301:
                
$title '301 Moved Permanently';
                
$heading 'Moved Permanently';
                
$desc 'The document has moved <a href="' $uri '">here</a>.';
                break;

            case 
302:
                
$title '302 Moved Temporarily';
                
$heading 'Moved Temporarily';
                
$desc 'The document has moved <a href="' $uri '">here</a>.';
                break;                
                
            default:
                
$title 'Unrecognised Response Code';
                
$heading 'Unrecognised Response Code';
                
$desc 'The server\'s redirect behaviour is not correctly configured.';
                break;
        
        }            
        
        echo 
'<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">';
        echo 
'<html><head>';
        echo 
"<title>$title</title>";
        echo 
'</head><body>';
        echo 
"<h1>$heading</h1>";
        echo 
"<p>$desc</p>";
        echo 
'<hr>';
        if (isset(
$_SERVER['SERVER_SIGNATURE']))
                echo 
$_SERVER['SERVER_SIGNATURE'];
        echo 
'</body></html>';
    }
    
    function 
setResponseCode($code) {
        
$this->m_responseCode $code;
    }

}

// Initialize
$re = new RedirectEngine();

// Redirect from http://domain.de/* to http://www.domain.de/*
$re->addHostRule('domain.de''www.domain.de');

// Redirect if there is a matching rule
$re->run(); 
Angepasst werden muss hier die vorletzte Zeile.

(Es ist nicht sonderlich schön, den Domainnamen hier explizit angeben zu müssen, aber das verhindert recht zuverlässig Schwierigkeiten beim Aufrufen von anderen Subdomains als www. Adressen wie blog.domain.de würden schließlich nicht unter die Regel domain.de fallen. -- Anders ist das ein wenig kompliziert, da nicht jede URL nach dem Schema subdomain.domain.topleveldomain aufgebaut ist. Man denke nur an http://www.icant.co.uk/ o. ä. Auch könnte der Domainname theoretisch mit www beginnen: http://www.www.de/.)

Edit: Wo ich so drüber nachdenke: Dafür gibt es bestimmt Funktionen.

eine-seite.php

Code:
<?php

require_once 'inc.redirect.php';

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>PHP Header-Redirect</title>
</head>
<body>
<h1>PHP Header-Redirect</h1>
<p>Diese Seite sollte nicht ohne das www-Pr&auml;fix aufgerufen werden k&ouml;nnen.</p>
</body>
</html>
Das müsste so funktionieren. Zusätzliche header()-Anweisungen solltest du problemlos oberhalb der require_once-Zeile oder in inc.redirect.php oberhalb der Initialisierung der Klasse einfügen können. (Letzteres wäre natürlich nachträglich flexibler anzupassen.)

Gruß
Marc

PS: Ich rätsele da jetzt schon seit gestern Nachmittag dran rum:

Was ist eigentlich diese ominöse $_SERVER['SCRIPT_URI']? Laut php.net gehört der Wert jedenfalls nicht zum Kanon.

Oder wo wir schon dabei sind: SERVER_NAME ist im Gegensatz zu HTTP_HOST frei belegbar?
Mit Zitat antworten
  #15 (permalink)  
Alt 15.07.2006, 18:48
Benutzerbild von Despairing
Despairing.org
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 31.05.2006
Beiträge: 277
Despairing befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von netspy
Ich hab das ganze mal noch etwas abgeändert und erweitert. Jetzt wird auch noch eine entsprechende HTML-Seite mit ausgegeben, die besonders für Suchmaschinen interessant ist, die einen 301er nicht verstehen.

PHP-Code:
<?php

if (isset($_SERVER['HTTP_HOST']) && stripos($_SERVER['HTTP_HOST'], 'www') !== 0) {

  
header('Location: http://www.'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], true301);

?>

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="<?php print('http://www.'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); ?> ">here</a>.</p>
<hr>
<?php if (isset($_SERVER['SERVER_SIGNATURE'])) print($_SERVER['SERVER_SIGNATURE']) ?>
</body></html>

<?php

  
exit;

}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>PHP Header-Rewrite</title>
</head>

<body>
<h1>PHP Header-Rewrite</h1>
</body>
</html>
[...]
Sorry, check' ich nich'.
Warum soll eine zusätzliche HTML-Seite ausgegeben werden ...?

@all: Ich verstehe eure Beiträge ab Beitrag #11 überhaupt nicht mehr ...
__________________
www.despairing.org
Mit Zitat antworten
  #16 (permalink)  
Alt 15.07.2006, 19:18
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 13.07.2006
Beiträge: 745
mermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblick
Standard

Ich kann dir mit meinem gefährlichen Halbwissen nicht genau sagen, ob netspys Suchmaschinen-Argument entscheidend ist. (Aber da ich es eben nicht weiß, gehe ich mal davon aus, dass er sich was dabei gedacht hat. )

Es geht dabei lediglich um ein Zugeständnis an aufrufende Skripte (ich nenne das jetzt einfach mal so), die dem von PHP ausgelösten header()-Redirect nicht folgen (können?). (Mit anderen Worten: Manche Leute lassen sich nicht gern von einer Seite auf die andere schubsen.)

In diesem Fall soll klargemacht werden, dass domain.de nicht die korrekte Adresse der Seite ist, sondern www.domain.de. Falls der Benutzer (warum auch immer) nicht weitergeleitet wird, bekommt er dann eine Seite zu sehen, auf der ihm gesagt wird, dass sich die eigentliche Seite nicht an dieser Stelle (domain.de) befindet, sondern unter www.domain.de aufzurufen ist.

Sollte eine solche Seite nicht ausgegeben werden, erschiene -- wenn der Redirect schiefläuft -- theoretisch eine leere Seite im Browser, mit der niemand was anfangen kann.

Im Normalfall (> 99 % (?)) wird diese "Zusatzseite" überhaupt nicht beachtet.

Was meine ausgelagerte Klasse aus dem letzten Post angeht:

Programmieren ist immer in erster Linie das Behandeln von Sonderfällen, wodurch eigentlich simpler Code, der unter fast allen Umständen auch mit einer Zeile funktionieren würde, mitunter ziemlich lang werden kann. Dazu habe ich versucht, diesen Teil der Seitenerstellung zentral auszulagern. Ich denke, du wirst den entsprechenden Code auf zahlreichen Seiten verwenden wollen? Dazu würde zu Beginn jeder Seite das Einbinden der Klassendatei (per require_once, s. o.) ausreichen, sodass sämtliches Redirect-Verhalten von einer zentralen PHP-Datei geregelt würde, die in die einzelnen Seiten eingefügt wird. (Das hat natürlich auch den Vorteil, dass du den Code zentral ändern kannst und ihn nicht auf jeder Seite anpassen müsstest. Wegen sowas hat man PHP schließlich erfunden.)

Abgesehen davon solltest du dich vielleicht mit einigen PHP-Grundlagen vertraut machen, wenn du es schon verwendest.
Mit Zitat antworten
  #17 (permalink)  
Alt 16.07.2006, 10:46
Benutzerbild von netspy
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 13.08.2004
Ort: Leipzig
Beiträge: 1.953
netspy sorgt für eine eindrucksvolle Atmosphärenetspy sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von Despairing
Sorry, check' ich nich'.
Warum soll eine zusätzliche HTML-Seite ausgegeben werden ...?
Weil nicht jeder Client einem Redirect folgen kann oder will. Manche Suchmaschinen verstehen den nicht und würden in dem Fall nur eine leere Seite bekommen. Durch die Klartextmeldung inkl. Link kommen sie damit doch noch auf die neue Seite. Auch bei Browsern muss der Nutzer nicht weitergeleitet werden. Bei Opera ist es bspw. sehr leicht, den Redirect zu unterbinden und da hilft die Seite auch, dass der Nutzer selbst klicken kann.

@mermshaus: stimmt, strpos gibt es schon ab PHP3. Man kann/sollte also auch mit strpos(strtolower($_SERVER['HTTP_HOST']), 'www')) testen.
__________________
AppDev Blog · AppDev Forum
Mit Zitat antworten
Antwort


Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
jquery // css ändern vor header weiterleitung bzw. nach erzeugtem pdf monran Javascript & Ajax 2 02.03.2011 21:25
301 Weiterleitung .htaccess BoFiaZ Serveradministration und serverseitige Scripte 4 20.09.2010 18:22
Weiterleitung mit .htaccess ms_fvfv Serveradministration und serverseitige Scripte 1 02.08.2010 22:28
Fehlermeldung: "No input file specified" nach php weiterleitung nevermind Serveradministration und serverseitige Scripte 2 19.09.2008 10:27
weiterleitung omex (X)HTML 3 17.10.2007 23:38


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:00 Uhr.