Friedrich: mod_rewrite richtige Anwendung (Mehrere Fälle)

<h1> alle zusammen.

Ich sitze wieder seit 2 Tagen an mod_rewrite... Ich habe verschiedene Möglichkeiten ausprobiert, an eine Lösung des Problem zu gelangen.

So sieht die html Datei mit ihren Links aus:

<div> <a href='./webspace.html'>Websp</a> | <a href='./fanta.html'>Fanta</a> | <a href='./games/web.html'>Games</a> | <a href='./sehr/doefli.html'>MonsterX</a> </div>

Standardvariante ohne Ordner, funktioniert bei mir ohne Probleme. Die Seite wird einfach intern zu einem index.php mit werten zu gewiesen, die ich via Get auslesen kann, ohne das die URL sich oben ändert.

RewriteRule ^(\w*)\.html$ ./index.php?s=$1 [NC]
(Hier extra \w, damit nur die Dateinamen erfasst werden)

Ab nun tauchen die Probleme auf. Ich habe versucht, das auf verschiedene Arten zu lösen.

1. Wie oben, nur mit einem Ordner davor. Die nachfolgenden Anweisungen sind auch immer vor obiger Funktion positioniert!

  RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/(\w*)/(\w*)\.html$ [NC]  
  RewriteRule ^(\w*)/(\w*)\.html$ index.php?s=$2&k=$1 [NC]

Bei dieser Variante, wird zwar alles übergeben, und auch die URL ist wie gewünscht mit http://example.com/sehr/doefli.html zu erreichen, aber plötzlich ist das Design weg. d.H. das Stylesheet wird nicht mehr eingebunden... Es ist aber die index.php an die die Daten übergeben werden. Ich wäre hier ja schon fertig, wenn das Design nicht flöten ginge.

2. Wenn ich dies verwende mit Redirect:
  RewriteRule ^(\w*)/(\w*)\.html$ http://example.com/index.php?k=$1&s=$2 [R,NC]
Dann habe ich meine Adresszeile logischerweise mit den Get Parametern. Aber ich will ja die adresszeile mit /test/doefli.html.

Also schrieb ich danach folgenden Code:
  ~~~perl RewriteCond %{QUERY_STRING} k=(\w*)&s=(\w*)
  RewriteRule ^(.)index.php?k=(\w)&s=(\w*)$ http://example.com/$1/$2.html [R,NC]

  
Die Url wird dann aber nicht zu dem gewünschten Ergebnis (http://example.com/sehr/doefli.html) verändert. Ich würde mich sehr freuen, wenn man mir beide richtigen Wege zuende aufweist, wenn es möglich ist.  
  
  
Vielen Dank!  
Friedrich
  1. Hallo,

    Bei dieser Variante, wird zwar alles übergeben, und auch die URL ist wie gewünscht mit http://example.com/sehr/doefli.html zu erreichen, aber plötzlich ist das Design weg. d.H. das Stylesheet wird nicht mehr eingebunden...

    und wie ist das CSS in dieser Ressource referenziert.

    Es ist aber die index.php an die die Daten übergeben werden.

    Nein. Der Browser fordert die CSS-Ressource an. Der Browser weiß nichts von einer index.php. Ist die CSS-Ressource beispielsweise mit

    <link rel="stylesheet" type="text/css" href="example.css">  
    
    ~~~ referenziert, so fordert der Browser in diesem Fall die Ressource  
      
        http://example.com/sehr/example.css  
      
    an. Ist dies nicht das, was Du willst, so ändere die Pfadangabe entsprechend ab.  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. Hi,
      danke!

      Habe den CSS Pfad mal absolut angegeben.

      http://example.com/sehr/example.css

      Mir ist aber auch jetzt wieder eingefallen, was ich dazu noch sagen wollte (peinlich, ich wollte es schreiben, aber direkt vergessen)...

      Wenn ich denn dann auf die Links klicke, funzt es. Aber ... wenn ich dann auf den gleichen Link nochmal klicke, oder auf einen anderen, erhalte ich folgendes ergebnis bei mehrmaligem Klicken in der Adresszeile:

      http://example.com/test/test/test/doefli.html

      Wie kann ich diese Situation umgehen?

      Danke nochmal für die Antwort, so klappt es denn auch. Nicht so kompliziert denken ;D

      1. Hi,

        Wenn ich denn dann auf die Links klicke, funzt es. Aber ... wenn ich dann auf den gleichen Link nochmal klicke, oder auf einen anderen, erhalte ich folgendes ergebnis bei mehrmaligem Klicken in der Adresszeile:

        http://example.com/test/test/test/doefli.html

        Wie kann ich diese Situation umgehen?

        In dem du dir auch klar machst, was die Antwort, die du bekommen hast, alles impliziert.

        *Alle* relativen Pfadangaben vervollständigt der Client, ausgehend vom Basisdokument (also das HTML-Dokument für Bilder, Scripte, Stylesheets, und das Stylesheet für darin referenzierte Ressourcen wie bspw. Hintergrundbilder).

        Wenn du also immer aus dem aktuellen "Verzeichnis" heraus auf test/doefli.html verlinkst, dann "addieren" sich natürlich die Verzeichnisangabe im Pfad-Bestandteil der aktuellen Dokumentadresse test/doefli.html und die in der im Link angegebenen Adresse.

        Da du das nicht willst, lautet die Antwort auf diese Frage also immer noch so wie auf die vorherige: Mach dir klar, was es bedeutet, dass der Client Pfadangaben vervollständigt - und gebe anschließend *korrekte* Pfade an. Die müssen nicht unbedingt absolut inkl. Angabe von Protokoll und Domain sein, sondern können bspw. auch absolut zum Basis-URI angegeben werden.
        Arbeite bitte die komplette verlinkte Seite mal durch - das ist Basiswissen im Bereich HTML und HTTP.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Danke:

          http://de.selfhtml.org/html/allgemein/referenzieren.htm#absolut
          Arbeite bitte die komplette verlinkte Seite mal durch - das ist Basiswissen im Bereich HTML und HTTP.

          Ich sah, das das Problem daran lag, und ich weiß auch sonst wie ich es machen müsste, aber irgendwie habe ich eine Denkblockade, stehe auf dem Schlauch. Sonst gefällt es mir aus schwierigen Sachen einfaches zu machen. Ich habe aber anscheinend das mit dem mod_rewrite nicht komplett verstanden.

          Inzwischen sieht mein Ergebnis so aus:

            RewriteCond %{HTTP_REFERER} !^http://example\.com/(\w*)/(\w*)\.html$ [NC]  
            RewriteRule ^(\w*)/(\w*)\.html$ ./index.php?k=$1&s=%2
          

          Damit werden keine Ordner mehr erstellt jedoch wird der s=parameter nicht mehr übergeben. Ab hier sähe ich aber nur noch zwei Möglichkeiten: Entweder ich gebe die Domain mit Pfad an um ein Ereignis auszulösen so wie ich es bei sehr viele SEO Seiten gesehen habe - was mir aber absolut nicht gefällt oder ich fange in der index.php den aktuellen ordner ab und müsste jeden einzelnen Link manipulieren um es auf diese URL einzurichten. Das würde aber sehr sehr viel Arbeit bedeuten und da das mit dem abfangen des Parameters s= nicht klappt, für mich absolut uninteressant.

          Ich versuche hier schon wieder seit knapp 2 Stunden eine Antwort zu finden, zu testen, aber irgenwie bleibe ich immer ungefähr bei meinem Anfangsergebnis hängen.

          Würdest du so nett sein, ein Beispiel - die Lösung - zu geben und dieses für mich zu erläutern, damit ich dieses Thema besser verstehe? Ich mag programmieren und ich will am liebsten alles wissen. Aber wenn es wieder irgendwo hakt, steht bei mir alles für Tage still. Bisher habe ich auch alles selbst rausgefunden mit Suchen und brauchte nie Hilfe bei anderen Sachen. Nur hier, irgendwie der Gedankenverkehr blockiert.

          Würde mich sehr freuen ...

          Friedrich

          1. Hi,

            Ich sah, das das Problem daran lag, und ich weiß auch sonst wie ich es machen müsste, aber irgendwie habe ich eine Denkblockade, stehe auf dem Schlauch. Sonst gefällt es mir aus schwierigen Sachen einfaches zu machen. Ich habe aber anscheinend das mit dem mod_rewrite nicht komplett verstanden.

            mod_rewrite beeinflusst nur das, was server-intern passiert (zumindest bei dieser Art der Anwendung).

            Wenn der Client also ein Dokument von http://example.org/foo/bar anfordert, dann ist genau das die Adresse, die er zur Vervollständigung relativer Pfadangaben verwendet - was server-intern passiert, ob da ein Script namens index.php dahinter steckt oder deine Oma, dass ist dem Client furzegal.

            Also verlinke deine externen Ressourcen in deinen Dokumenten so, dass die Pfad-Tiefe (wenn du es hinsichtlich dieser variabel halten willst) keine Rolle mehr spielt. Mehrere mögliche Vorgehensweisen beschreibt das verlinkte Kapitel.

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
            1. Also verlinke deine externen Ressourcen in deinen Dokumenten so, dass die Pfad-Tiefe (wenn du es hinsichtlich dieser variabel halten willst) keine Rolle mehr spielt. Mehrere mögliche Vorgehensweisen beschreibt das verlinkte Kapitel.

              Also bedeutet das, dass ich meine URL + Pfad angeben soll in den Links in der Form href='http://example.com/pfad/datei.html' und es führt kein Weg daran vorbei?

              1. Hi,

                Also bedeutet das, dass ich meine URL + Pfad angeben soll in den Links in der Form href='http://example.com/pfad/datei.html' und es führt kein Weg daran vorbei?

                Also bedeutet diese Frage, dass du die Antworten immer noch nicht aufmerksam gelesen hast ...?

                Dass eine absolute Angabe in dieser Form nicht unbedingt erforderlich bzw. die einzige Möglichkeit ist, darauf habe ich dich doch schon explizit hingewiesen.

                MfG ChrisB

                --
                RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                1. Einfache Methode mittels der Wurzelverzeichnismethode (von ChrisB) folgend...

                  HTML:
                  <div> <a href='/webspace.html'>Jetzt</a> | <a href='/fanta.html'>funktioniert</a> | <a href='/games/web.html'>es</a> | <a href='/test/doefli.html'>!</a> </div>

                  Hypertext Zugriff:

                    
                  # URL Manipulation  
                   RewriteCond %{REQUEST_URI} !-f  
                   RewriteRule ^(\w*)/(\w*)\.html$ /index.php?k=$1&s=$2  
                   RewriteRule ^(\w*)\.html$ /index.php?s=$1  
                  
                  

                  Ich habe über dies Gerüchte gehört, das soll fürs Suchmaschinenranking nicht so die optimale Lösung sein, weil die Scheinurl und auch die Index.php mit ihren Parametern, deren Content ausgelesen wird ("DC")... Es ist ein Gerücht und ich bin mir nicht sicher (wer weiß schon wie alle Wege der guten Suchmaschinenoptimierung sind?). Daher, einfach um dem vorzubeugen robots.txt mit den entsprechenden Regelungen anlegen.

                  Außerdem:
                  <http://www.azella.de/blog/2011/07/x-powered-by-entfernen/ >