kungschu: mod_rewrite / URL Rewriting

Hallo.

Ich versuche gerade, mir etwas URL Rewriting anzueignen. Allerdings scheitere ich jetzt schon an einer einfachen RewriteRule.

http://localhost:8888/blog/artikel/beispiel soll als

http://localhost:8888/blog/artikel.php?url=beispiel verarbeitet werden.

Versucht habe ich Erstens:

RewriteEngine on
   RewriteRule ^/blog/artikel/([a-zA-Z0-9-]+)$ /blog/artikel.php?url=$1 [L]

->Ergebnis: Not found 404

Zweitens:

RewriteEngine on
   RewriteRule ^http://localhost:8888/blog/artikel/([a-zA-Z0-9-]+)$ http://localhost:8888/blog/artikel.php?url=$1 [L]

->Ergebnis: Not found 404

mod_rewrite ist natürlich installiert.
In der apache_error_log kann ich finden:

/blog/.htaccess: RewriteRule: bad flag delimiters

Offenbar habe ich ein Fehler in den regulären Ausdrücken, oder.? Wo liegen meine Fehler?

Dankeschön.

MfG, Kungschu.

--
Brain: an apparatus with which we think we think.
  1. Hallo.

    Hat jemand noch eine Idee, was an meiner RewriteRule fehlerhaft sein könnte?
    Ist die Fehlerbeschreibung mangelhaft? Oder die Konkurrenzveranstaltung einfach zu einmalig?

    MfG, Kungschu.

    --
    Brain: an apparatus with which we think we think.
  2. Hallo Kungschu,

    Hat jemand noch eine Idee, was an meiner RewriteRule fehlerhaft sein könnte?
    Ist die Fehlerbeschreibung mangelhaft? Oder die Konkurrenzveranstaltung einfach zu einmalig?

    Ähem.

    Options +FollowSymLinks (falls das nicht sowieso in Deiner httpd.conf schon zugelassen ist)

    RewriteEngine on
       RewriteRule ^/blog/artikel/([a-zA-Z0-9-]+)$ /blog/artikel.php?url=$1 [L]

    Ich mutmaße jetzt mal, dass sich dies nicht in Deiner httpd.conf, sondern in einer .htaccess befindet. In diesem Fall solltest Du das führende Slash weglassen.
    Du kannst außerdem noch ein optionales Slash am Schluss hinzufügen.
    Also:
    RewriteRule ^blog/artikel/([a-zA-Z0-9\-]+)/?$ /blog/artikel.php?url=$1 [L]

    Gruß,
    David

    1. Hallo David.

      Options +FollowSymLinks (falls das nicht sowieso in Deiner httpd.conf schon zugelassen ist)

      Das ist zugelassen, hatte ich probeweise aber auch nochmals angeführt.

      Ja, es handelt sich um eine .htaccess-File.
      Ich habe es nun wie folgt versucht:

        
      RewriteEngine on  
      RewriteRule ^blog/artikel/([a-zA-Z0-9\-]+)$ /blog/artikel.php?url=$1 [L]  
      
      

      Not found 404 (Bei Eingabe von: http://localhost:8888/blog/artikel/test)

      Füge ich noch eine RewriteBase (http://localhost:8888 bzw. http://localhost:8888/) hinzu, wird ein Internal Server Error verursacht (The server encountered an internal error or misconfiguration and was unable to complete your request.), sobald ich http://localhost:8888/blog/ aufrufen möchte.
      Die apache_error_log gibt aus: /blog/.htaccess: RewriteBase takes one argument, the base URL of the per-directory context.
      Es müsste ja aber auch ohne gehen.

      Danke dir.

      MfG, Kungschu.

      --
      Brain: an apparatus with which we think we think.
      1. Hallo Kungschu,

        Ja, es handelt sich um eine .htaccess-File.
        Ich habe es nun wie folgt versucht:

        RewriteEngine on
        RewriteRule ^blog/artikel/([a-zA-Z0-9-]+)$ /blog/artikel.php?url=$1 [L]

        
        > Not found 404 (Bei Eingabe von: http://localhost:8888/blog/artikel/test)  
        >   
        > Füge ich noch eine RewriteBase  [...].  
        > Es müsste ja aber auch ohne gehen.  
          
        Ich komme jetzt etwas ins Schwimmen: Ja, es geht auch ohne RewriteBase, wenn der Pfad in der URL dem Pfad in Deinem lokalen Dateisystem entspricht. Das tut er "blog/" und "blog/". Ich \*glaube\*, dass Du auch im zweiten Teil den führenden Slash weglassen must, also:  
        ~~~apache
        RewriteEngine on  
        RewriteRule ^blog/artikel/([a-zA-Z0-9\-]+)$ blog/artikel.php?url=$1 [L]
        

        ^^^^
        Probiers einfach aus ;)

        Du könntest aber die .htaccess auch einfach ins Verzeichnis "blog" verschieben, da die Rewrite-rules nur dieses betreffen, und dann schreiben:

        RewriteEngine on  
        RewriteRule ^artikel/([a-zA-Z0-9\-]+)$ artikel.php?url=$1 [L]
        

        Wie Du sicher weist, wird die .htaccess bei jedem Request ausgewertet. Auf diese Weise sparst Du etwas Rechenzeit, wenn nicht aufs Blog zugegriffen wird.

        Gruß, David

        1. Hallo.

          Probiers einfach aus ;)

          Diesen Weg verfolge ich nun schon eine Weile; da ich immernoch kein Erfolg habe, bin ich etwas ratlos. Evtl. teste ich doch noch online, wenn ich eine TestDB eingerichtet habe.

          Du könntest aber die .htaccess auch einfach ins Verzeichnis "blog" verschieben, da die Rewrite-rules nur dieses betreffen, und dann schreiben:
          RewriteEngine on
          RewriteRule ^artikel/([a-zA-Z0-9\-]+)$ artikel.php?url=$1 [L]

          Habe ich gemacht; keine Reaktion.

          Wie Du sicher weist, wird die .htaccess bei jedem Request ausgewertet.

          Sonst wäre das URL Rewriting ja schlecht möglich.

          Ich werde sehen, wie ich weiterkomme. Vorerst herzlichen Dank für deine Hilfe!

          MfG, Kungschu.

          --
          Brain: an apparatus with which we think we think.
  3. hi,

    Versucht habe ich Erstens:

    RewriteEngine on
       RewriteRule ^/blog/artikel/([a-zA-Z0-9-]+)$ /blog/artikel.php?url=$1 [L]

    ->Ergebnis: Not found 404
    [...]
    In der apache_error_log kann ich finden:

    /blog/.htaccess: RewriteRule: bad flag delimiters

    Das deutet darauf hin, dass die Delimiter für die Angabe des Flags nicht korrekt sind.

    Überprüfe mal, ob die Leerzeichen wirklich Leerzeichen sind - oder vielleicht etwas anderes, was dann dafür sorgt, dass die Anzahl öffnender und schliessender eckiger Klammern am Ende nicht mehr passt.

    Und den Slash vor dem letzten - in der Zeichenklasse kannst du auch weglassen; wenn das - am Anfang oder Ende einer Klasse steht, hat es keine Sonderbedeutung mehr.

    Zweitens:

    RewriteEngine on
       RewriteRule ^http://localhost:8888/blog/artikel/([a-zA-Z0-9-]+)$ http://localhost:8888/blog/artikel.php?url=$1 [L]

    Das kann natürlich nichts bringen, weil die RewriteRule nur den REQUEST_URI betrachtet, und Protokoll/Hostname/Port sind nicht Bestandteil von diesem.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo.

      Überprüfe mal, ob die Leerzeichen wirklich Leerzeichen sind - oder vielleicht etwas anderes, was dann dafür sorgt, dass die Anzahl öffnender und schliessender eckiger Klammern am Ende nicht mehr passt.

      Derartiges konnte ich nicht feststellen.

      RewriteEngine on
         RewriteRule ^http://localhost:8888/blog/artikel/([a-zA-Z0-9-]+)$ http://localhost:8888/blog/artikel.php?url=$1 [L]

      Das kann natürlich nichts bringen, weil die RewriteRule nur den REQUEST_URI betrachtet, und Protokoll/Hostname/Port sind nicht Bestandteil von diesem.

      Das hatte ich vermutet; es war mehr ein Rundumschlag aus Ratlosigkeit.

      Danke dir.

      MfG, Kungschu.

      --
      Brain: an apparatus with which we think we think.
  4. Hallo.

    Was passiert denn bei:

    RewriteEngine on
       RewriteRule ^/blog/artikel/([a-zA-Z0-9-]+)$ blog/artikel.php?url=$1 [L]

    Gruß Gunther

    1. Hallo Gunther.

      Was passiert denn bei:

      RewriteEngine on
         RewriteRule ^/blog/artikel/([a-zA-Z0-9-]+)$ blog/artikel.php?url=$1 [L]

      Auch das klappt nicht. (404)
      Versuche das Ganze jetzt mal online und melde mich später gegebenenfalls nochmals.

      Danke.

      MfG, Kungschu.

      --
      Brain: an apparatus with which we think we think.
      1. hi,

        RewriteEngine on
           RewriteRule ^/blog/artikel/([a-zA-Z0-9-]+)$ blog/artikel.php?url=$1 [L]

        Auch das klappt nicht. (404)

        MultiViews aktiv?

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
  5. Hallo.

    Nun funktioniert es; den Fehler konnte ich nicht genau ermitteln. Ich habe die htaccess allerdings neu angelegt. Evtl. doch ein Problem mit (Leer-)Zeichen.?

    Der Inhalt der htaccess:

      
    RewriteEngine on  
    RewriteRule ^artikel/([a-zA-Z0-9-]+)$ artikel.php?url=$1  
    
    

    Nochmals herzlichen Dank _david, wahsaga, Gunther!

    MfG, Kungschu.

    --
    Brain: an apparatus with which we think we think.