Munshta: HTACCESS-Rewrite: Rule-Regex gibt $1 = "index" zurück.

hi,
ich verfüge zwar im .htaccess-Bereich nicht über viele Kentnisse, aber ich laß ein paar Artikeln darüber und verfasste eine einfache Wereiterleitung:

  
RewriteEngine on  
RewriteRule ^(\w{1,6}).*$ index.php?kategorie=mitarbeiter&seite=$1  
ErrorDocument 404 http://univie.ac.at/skandinavistik/service/umleitung.php  

(Das "ErrorDocument 404" gehört natürlich nicht dazu, aber ist eben auch in dieser Datei enthalten)

In diesem Regex ging es mir darum, alle Buchstaben des Dateinamens bei in den GET des Indexes zu übertragen. Da längerer Mitarbeiternamen intern auf 6 Buchstaben gekürtzt sind und in der CleanURI ausgeschrieben werden, will ich einfach nur die ersten 6 Buchstaben der CleanURI wissen.
Jedoch wird immer eingabenunabhängig die Seite "index.php?kategorie=personalia&seite=index" aufgerufen.

Ich habe versucht als Mengenangabe für \w {6,6} angegeben, dann funtzt's wie vorgesehen.

Das alles kann ich mir nicht erklären, über Antworten würde ich mich sehr freuen.
lg Munshta

  1. Hi,

    RewriteRule ^(\w{1,6}).*$ index.php?kategorie=mitarbeiter&seite=$1

    In diesem Regex ging es mir darum, alle Buchstaben des Dateinamens bei in den GET des Indexes zu übertragen. Da längerer Mitarbeiternamen intern auf 6 Buchstaben gekürtzt sind und in der CleanURI ausgeschrieben werden, will ich einfach nur die ersten 6 Buchstaben der CleanURI wissen.
    Jedoch wird immer eingabenunabhängig die Seite "index.php?kategorie=personalia&seite=index" aufgerufen.

    Wenn Rewriting per htaccess konfiguriert wird, dann schreibt der Apache den Request intern um - und startet dann eine neue Runde, in der er den gerade umgeschriebenen Request so behandelt, als wäre er ein neu heringekommener.

    Eine Anfrage nach /blahblubb wird also zunächst in /index.php?kategorie=mitarbeiter&seite=blahbl umgeschrieben;
    und dann wird /index.php?kategorie=mitarbeiter&seite=blahbl wiederum durch die Maschinerie geschickt.
    /index.php?... enthält fünf Zeichen, die der Zeichenklasse \w entsprechen - nämlich index, der nachfolgende Punkt nicht mehr. Also wird dieser Request jetzt wiederum auf /index.php?kategorie=mitarbeiter&seite=index umgeschrieben.
    Eigentlich müsstest du damit sogar in einer Endlosschleife landen.

    Ich habe versucht als Mengenangabe für \w {6,6} angegeben, dann funtzt's wie vorgesehen.

    /index.php beginnt ja auch nicht mit genau 6 Zeichen, die \w erfüllen.

    An einfachsten löst du das mit einer vorgeschalteten RewriteCond, die den REQUEST_URI untersucht - und ihn entweder darauf überprüft, dass er nicht auf index.php lautet; oder vielleicht besser noch, dass die nachfolgende Regel nicht befolgt wird, wenn er zu einer physisch existenten Datei (oder einem Verzeichnis) passt - siehe dazu die möglichen Flags der RewriteCond.

    ErrorDocument 404 http://univie.ac.at/skandinavistik/service/umleitung.php

    (Das "ErrorDocument 404" gehört natürlich nicht dazu, aber ist eben auch in dieser Datei enthalten)

    Das solltest du *so* übrigens nicht angeben - denn die Angabe einer Adresse inkl. http:// löst einen Redirect aus. Der Client fordert dann http://univie.ac.at/skandinavistik/service/umleitung.php mit einem neuen Request an, und wird wahrscheinlich einen HTTP STatuscode 200 bekommen - und der eigentlich wichtige (bspw. für Suchmaschinen, aber auch andere Clients) Status 404 geht verloren.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. hi,

      Wenn Rewriting per htaccess konfiguriert wird, dann schreibt der Apache den Request intern um - und startet dann eine neue Runde, in der er den gerade umgeschriebenen Request so behandelt, als wäre er ein neu heringekommener.

      Eine Anfrage nach /blahblubb wird also zunächst in /index.php?kategorie=mitarbeiter&seite=blahbl umgeschrieben;
      und dann wird /index.php?kategorie=mitarbeiter&seite=blahbl wiederum durch die Maschinerie geschickt.
      /index.php?... enthält fünf Zeichen, die der Zeichenklasse \w entsprechen - nämlich index, der nachfolgende Punkt nicht mehr. Also wird dieser Request jetzt wiederum auf /index.php?kategorie=mitarbeiter&seite=index umgeschrieben.
      Eigentlich müsstest du damit sogar in einer Endlosschleife landen.

      Vielen

      An einfachsten löst du das mit einer vorgeschalteten RewriteCond, die den REQUEST_URI untersucht - und ihn entweder darauf überprüft, dass er nicht auf index.php lautet; oder vielleicht besser noch, dass die nachfolgende Regel nicht befolgt wird, wenn er zu einer physisch existenten Datei (oder einem Verzeichnis) passt - siehe dazu die möglichen Flags der RewriteCond.

      Wenn ich aber den Flag "NV" - ich nehme an, dass du diesen meinst - setzte, bräuchte ich ja, wenn ich das richtig verstehe, eine leere Cond. Lasse ich da einfach die anderen Parameter aus und beginne dann gleich mit dem Flag?
      Es tut mir leid, falls ich jetzt mit dummen Fragen komme, aber ich bin mit diesem .htaccess-Syntax nicht vertraut.

      Das solltest du *so* übrigens nicht angeben - denn die Angabe einer Adresse inkl. http:// löst einen Redirect aus. Der Client fordert dann [...] an, und wird wahrscheinlich einen HTTP STatuscode 200 bekommen - und der eigentlich wichtige (bspw. für Suchmaschinen, aber auch andere Clients) Status 404 geht verloren.

      Also meinst du, ich sollte die URI in der Form
      sub.domain.land/ordner/datei.end
      notierten.

      Vielen Dank, falls du mir nochmals auf die Sprünge hilfst.
      lg Munsh.

      1. Hi!

        An einfachsten löst du das mit einer vorgeschalteten RewriteCond, die den REQUEST_URI untersucht - und ihn entweder darauf überprüft, dass er nicht auf index.php lautet; oder vielleicht besser noch, dass die nachfolgende Regel nicht befolgt wird, wenn er zu einer physisch existenten Datei (oder einem Verzeichnis) passt - siehe dazu die möglichen Flags der RewriteCond.
        Wenn ich aber den Flag "NV" - ich nehme an, dass du diesen meinst - setzte, bräuchte ich ja, wenn ich das richtig verstehe, eine leere Cond. Lasse ich da einfach die anderen Parameter aus und beginne dann gleich mit dem Flag?

        Ähm, ich glaube ChrisB hat nicht die "Flags" sondern die "CondPattern" gemeint (also -f für physisch existente Dateien und -d für Verzeichnisse)
        Als TestString verwendest du den REQUEST_URI und prüfst, ob es sich nicht(!) um eine Datei oder Verzeichnis handelt

        RewriteCond %{REQUEST_URI} !-f  
        RewriteCond %{REQUEST_URI} !-d
        

        FG Ulysses

        1. hi,

          RewriteCond %{REQUEST_URI} !-f

          RewriteCond %{REQUEST_URI} !-d

          Vielen Dank für die ausführlichen Antworten; nur eine mir Frage bleibt noch: Bei "Beispiel 3: lokales HTML-Dokument im aktuellen Verzeichnis" in deinem Link wird  
          ~~~apache
            
          # verzeichnisspezifisches HTML-Fehlerdokument  
          ErrorDocument 404 /verzeichnispfad/fehler404.htm  
          
          

          definiert.
          Ich frage mich jedoch, ob ich alle Verzeichnisse ab dem Wurzelverzeichnis oder nur den Namen des aktuellen .htaccess-Verzeichnisses bei "/verzeichnispfad/" angeben muss.

          Auch wenn dies sicherlich eine Apache-Anfängerfrage ist, würde ich mich über eine Antwort sehr freuen.
          lg Munshta

          1. Hallo,

            Bei "Beispiel 3: lokales HTML-Dokument im aktuellen Verzeichnis" in deinem Link wird

            verzeichnisspezifisches HTML-Fehlerdokument

            ErrorDocument 404 /verzeichnispfad/fehler404.htm

            
            > definiert.  
            > Ich frage mich jedoch, ob ich alle Verzeichnisse ab dem Wurzelverzeichnis oder nur den Namen des aktuellen .htaccess-Verzeichnisses bei "/verzeichnispfad/" angeben muss.  
              
            In der [Apache-Doku](http://httpd.apache.org/docs/2.0/mod/core.html#errordocument) heißt es:  
              "URLs can begin with a slash (/) for local web-paths (relative to the DocumentRoot), ..."  
              
            Das ist meiner Ansicht nach eine klare Aussage - die Angabe wird relativ zum Document Root interpretiert, muss also alle Verzeichnisebenen enthalten, die auch im entsprechenden URL-Pfad vorkommen würden (ich habe jetzt stellvertretend die Info aus der Doku zur Version 2.0 genommen; die anderen Versionen sind aber entsprechend).  
              
            Ciao,  
             Martin  
            
            -- 
            [Dieser Satz](http://community.de.selfhtml.org/zitatesammlung/zitat262) wurde in mühsamer Kleinstarbeit aus einzelnen Wörtern zusammengesetzt.  
              (Hopsel)
            
      2. Hi!

        Das solltest du *so* übrigens nicht angeben - denn die Angabe einer Adresse inkl. http:// löst einen Redirect aus. Der Client fordert dann [...] an, und wird wahrscheinlich einen HTTP STatuscode 200 bekommen - und der eigentlich wichtige (bspw. für Suchmaschinen, aber auch andere Clients) Status 404 geht verloren.
        Also meinst du, ich sollte die URI in der Form
        sub.domain.land/ordner/datei.end
        notierten.

        Oh, da ist ja noch eine Frage - hab ich beim ersten Mal gar nicht gesehen.

        Schau mal unter http://de.selfhtml.org/servercgi/server/htaccess.htm#fehlermeldungen, da steht, wie man's richtig macht.

        FG Ulysses

  2. Hallo,

    Jedoch wird immer eingabenunabhängig die Seite "index.php?kategorie=personalia&seite=index" aufgerufen.

    Das heißt $1 ist dann "index". Das rewrittende Script wird doch wieder in die Rewrite-Schleife gepackt, so habe ich das mal vertanden. Du müsstest also index.php vom Rewriten ausschließen, u.U. mit einer RewriteCond. Vielleicht klappt das ja auch mit deinm 6,6, weil index nur fünf Buchstaben hat?

    Gruß

    jobo