Willi: Mal wieder ein Problem mit .htaccess (und/oder Safari)

Hallo Leute,

Ich habe ein recht merkwürdiges Problem mit einer neuen Website.
Wie vermutlich viele andere leite ich in der htaccess alle Zugriffe (außer auf Dateien und Ordner, die real existieren) auf ein PHP-Script um, um dort die weitere Auswertung durchzuführen, welcher Inhalt denn angezeigt werden soll (per include).
Hört sich ja eigentlich alles recht einfach an, oder?

Das merkwürdige an der ganzen Sache ist aber, dass sich Safari weigert die Website anzuzeigen, Fehlermeldung:

Safari can’t open the page.
Too many redirects occurred trying to open “http://localsquires
/gastebuch”. This might occur if you open a page that is redirected to
open another page which then is redirected to open the original page.

(Ist noch die englische Beta, kommt aber entsprechend die gleiche Fehlermeldung auf einem Mac)

Das finde ich vor allem komisch, weil ja gar kein „echter“ Redirect stattfindet - es wird ja nur URI-abhängig verschiedene PHP-Dateien eingebunden. Das dürfte der Browser doch eigentlich gar nicht mitbekommen …

Damit das hier ein perfekter Anfangspost wird, darf natürlich auch nicht der Sourcecode fehlen (obwohl das nun wirklich nichts besonderes ist).
Nun denn - hier ist er:

.htaccess:

RewriteEngine on  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
  
RewriteRule ^.*$ /handle.php

handle.php (nur an einer Stelle gekürzt)

<?php  
 header('content-type: text/html; charset=utf-8');  
  
 if(preg_match('!([^\/]*)\/!',$_SERVER['REQUEST_URI'],$subpattern)) header("Location: ".$subpattern[1]);  
  
 $site = (strpos($_SERVER['REQUEST_URI'], '/', 1) !== false) ? substr($_SERVER['REQUEST_URI'], 1, strpos($_SERVER['REQUEST_URI'], '/', 1)-1) : substr($_SERVER['REQUEST_URI'], 1);  
 $site = (strpos($_SERVER['REQUEST_URI'], '?')) ? substr($site, 0, strpos($_SERVER['REQUEST_URI'], '?')-1) : $site;  
  
 switch($site){  
  
  case '':  
   $navi = 'home'; include 'index.php'; break;  
  
  case 'band':  
   $navi = 'band'; include 'band.php'; break;  
  
// many more stuff of that kind  
  
  default:  
   $code_ = 404;  
  include("error.php");  
 }  
?>

Wäre toll, wenn mir jemand bei der Lösung des Problems helfen könnte :-)

Liebe Grüße,
—Gabriel

  1. Hallo,

    if(preg_match('!([^/]*)/!',$_SERVER['REQUEST_URI'],$subpattern)) header("Location: ".$subpattern[1]);

      
    der Inhalt der Variable $\_SERVER['REQUEST\_URI'] sieht immer in folgender Form aus "/pfad/datei.endung?query\_string" (einfachste Variante: "/") preg\_match wird bei jedem Aufruf "1" (true) zurückgeben. $subpattern[1] ist dabei immer "" (Kein Inhalt). [RFC 2616 14.30](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30) verlangt aber die Angabe eines absoluten URI. BTW: Ein entsprechenden Status (hier 201, weil dynamisch) wäre auch schön.  
      
      
    Gruß aus Berlin!  
    eddi
    
    1. Hallo Eddi,

      if(preg_match('!([^/]*)/!',$_SERVER['REQUEST_URI'],$subpattern)) header("Location: ".$subpattern[1]);

      
      >   
      > der Inhalt der Variable $\_SERVER['REQUEST\_URI'] sieht immer in folgender Form aus "/pfad/datei.endung?query\_string" (einfachste Variante: "/") preg\_match wird bei jedem Aufruf "1" (true) zurückgeben. $subpattern[1] ist dabei immer "" (Kein Inhalt). [RFC 2616 14.30](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30) verlangt aber die Angabe eines absoluten URI.  
      
      Ja, stimmt. Das mit der absoluten URI habe ich vergessen, mache ich gleich.  
      Aber da dürfte der Hund nicht begraben liegen - weil der Subpattern gar nicht greift.  
      Ich versuche z.B. auf http://localsquires/links oder /band zuzugreifen - der RegExp greift ja nur, wenn noch ein Slash hintendran steht.  
      Oder fügt Safari irgendwie noch intern einen Slash an? Das würde mich schon sehr wundern …  
        
      
      > BTW: Ein entsprechenden Status (hier 201, weil dynamisch) wäre auch schön.  
      
      Okay, werde ich umsetzen  
        
      —Gabriel[﹫](http:///gabrielwilkes.de)
      
      -- 
      [ie:{ fl:| br:> va:) ls:< fo:| rl:( n4:( ss:| de:> js:| ch:? sh:( mo:} zu:}](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%7C+br%3A%3E+va%3A%29+ls%3A%3C+fo%3A%7C+rl%3A%28+n4%3A%28+ss%3A%7C+de%3A%3E+js%3A%7C+ch%3A%3F+sh%3A%28+mo%3A%7D+zu%3A%7D)
      
      1. Hi,

        if(preg_match('!([^/]*)/!',$_SERVER['REQUEST_URI'],$subpattern)) header("Location: ".$subpattern[1]);

          
        
        > Aber da dürfte der Hund nicht begraben liegen - weil der Subpattern gar nicht greift.  
        > Ich versuche z.B. auf http://localsquires/links oder /band zuzugreifen - der RegExp greift ja nur, wenn noch ein Slash hintendran steht.  
          
        Oh nein ...  
          
        Du verlangst gar keinen Slash "hinten dran" - sondern dein Ausdruck verlangt nach "Null oder beliebig vielen Zeichen, die kein Slash sind, gefolgt von einem Slash" - und auch das lediglich \*irgendwo\* im zu durchsuchenden Text.  
        Der REQUEST\_URI beginnt mit einem Slash, bei deinem Beispiel /links oder /band - und damit erfuellt er deine Bedingung schon, denn was nach dem Slash noch kommt, daran zeigst du ja keinerlei Interesse mehr.  
          
        MfG ChrisB
        
        1. Hi ChrisB,

          if(preg_match('!([^/]*)/!',$_SERVER['REQUEST_URI'],$subpattern)) header("Location: ".$subpattern[1]);

          
          >   
          > > Aber da dürfte der Hund nicht begraben liegen - weil der Subpattern gar nicht greift.  
          > > Ich versuche z.B. auf http://localsquires/links oder /band zuzugreifen - der RegExp greift ja nur, wenn noch ein Slash hintendran steht.  
          >   
          > Oh nein ...  
          >   
          > Du verlangst gar keinen Slash "hinten dran" - sondern dein Ausdruck verlangt nach "Null oder beliebig vielen Zeichen, die kein Slash sind, gefolgt von einem Slash" - und auch das lediglich \*irgendwo\* im zu durchsuchenden Text.  
          > Der REQUEST\_URI beginnt mit einem Slash, bei deinem Beispiel /links oder /band - und damit erfuellt er deine Bedingung schon, denn was nach dem Slash noch kommt, daran zeigst du ja keinerlei Interesse mehr.  
          
          Aah, stimmt. Mist, das hatte ich doch tatsächlich übersehen, jetzt funktioniert es einwandfrei.  
            
          Noch grad eine andere Frage bezüglich RegExp:  
          Wie kann ich Strings wiederholen?  
          Ich möchte einen Regexp, der auf folgendes matcht:  
          /site/subsite/action/param/param2 …  
          Aber (([a-z0-9]{1,})/)\* klappt nicht.  
            
          Hast du ne Ahnung, wie das dann heißen muss? (Wenn ich NICHT jeden einzeln angeben möchte.)  
            
          —Gabriel[﹫](http://gabrielwilkes.de)
          
          -- 
          [ie:{ fl:| br:> va:) ls:< fo:| rl:( n4:( ss:| de:> js:| ch:? sh:( mo:} zu:}](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%7C+br%3A%3E+va%3A%29+ls%3A%3C+fo%3A%7C+rl%3A%28+n4%3A%28+ss%3A%7C+de%3A%3E+js%3A%7C+ch%3A%3F+sh%3A%28+mo%3A%7D+zu%3A%7D)
          
          1. Hallo,

            Wie kann ich Strings wiederholen?
            Ich möchte einen Regexp, der auf folgendes matcht...

            sieh Dir bitte Reguläre Ausdrücke (PCRE) an!

            Gruß aus Berlin!
            eddi

            1. Hallo シ

              Wie kann ich Strings wiederholen?
              Ich möchte einen Regexp, der auf folgendes matcht...

              sieh Dir bitte Reguläre Ausdrücke (PCRE) an!

              Oh, danke :)
              Hätte nicht erwartet, dass das im QuakeNet-PHP-Tut steht. Habe bisher in Sachen RegExp nicht so gute Erfahrungen gemacht, was das Finden von Tutorials angeht.
              Dankeschön :)

              —Gabriel