|
|||
Hier mal ein Auszug aus dem Inhalt der $_SERVER-Variable vom Server meiner Seite:
Code zur Ausgabe: PHP-Code:
Code:
[REQUEST_URI] => /sandbox/css/clipboard/php/rewrite/ [SERVER_NAME] => electronic-alcatraz.de 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:
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> |
Sponsored Links |
Sponsored Links |
|
||||
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:
Mario Geändert von netspy (15.07.2006 um 10:33 Uhr) |
|
|||
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:
(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äfix aufgerufen werden können.</p> </body> </html> 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? |
|
||||
Zitat:
Warum soll eine zusätzliche HTML-Seite ausgegeben werden ...? @all: Ich verstehe eure Beiträge ab Beitrag #11 überhaupt nicht mehr ...
__________________
www.despairing.org |
|
|||
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. |
|
||||
Zitat:
@mermshaus: stimmt, strpos gibt es schon ab PHP3. Man kann/sollte also auch mit strpos(strtolower($_SERVER['HTTP_HOST']), 'www')) testen. |
|
|
Ä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 |