constantin: Umgang Anführungszeichen in .htaccess

Hallo zusammen,

ich möchte solche URIs:
/suchbegriff?start=0&count=10 sowie
/kategorie/suchbegriff?start=0&count=10

umleiten nach:
results.php?searchtext=suchbegriff&start=0&count=10

Dafür steht in meiner .htaccess
RewriteCond %{QUERY_STRING} ^start=([0-9]+)&count=([0-9]+)$

RewriteRule ^(['\s+/,ÄÖÜäöüßa-zA-Z0-9-]*)/(['\s+,ÄÖÜäöüßa-zA-Z0-9-]+)$ results.php?searchtext=$2&start=%1&count=%2

RewriteCond %{QUERY_STRING} ^start=([0-9]+)&count=([0-9]+)$

RewriteRule ^(['\s+,ÄÖÜäöüßa-zA-Z0-9-]+)$ results.php?searchtext=$1&start=%1&count=%2

Das funktioniert. Aber nicht, wenn in "suchbegriff" ein Anführungszeichen (") vorkommt, also z.b.
http://meinServer/"Microsoft Word"?start=0&count=10

Dann bekomme ich einen Error 403 (Zugriff verweigert!
Der Zugriff auf das angeforderte Objekt ist nicht möglich. Entweder kann es vom Server nicht gelesen werden oder es ist zugriffsgeschützt.
Sofern Sie dies für eine Fehlfunktion des Servers halten, informieren Sie bitte den Webmaster hierüber.
Error 403)

Ich habe es schon probiert indem ich die Zeichenketten $1, bzw. $2 um Anführungszeichen (") bzw. (") sowie um [:punkt:] ergänzt habe - ohne Erfolg.

Weiß jemand, wie es auch mit Anführungszeichen funktioniert? Kann es evt sein, dass diese grundsätzlich nur im Querystring, aber nicht in der Adresse (also was vor dem ? kommt) vorkommen dürfen?

Vielen Dank,
Constantin

  1. Präzisierung:
    Gerade habe ich festgestellt, dass nur meine lokale Entwicklungsumgebung (xamp 1.70, windows) betroffen ist. Auf meinem Internet-Webserver funktioniert es, wenn ich die Variablen um ein Anführungszeichen (") ergänze.

    Ich ziehe also meine Frage zurück.

    Neue Frage:

    Weiß jemand, was ich machen muß, damit es auch lokal funktioniert?

    Vielen Dank,
    Constantin

  2. Moin!

    Dafür steht in meiner .htaccess
    RewriteCond %{QUERY_STRING} ^start=([0-9]+)&count=([0-9]+)$

    RewriteRule ^(['\s+/,ÄÖÜäöüßa-zA-Z0-9-]*)/(['\s+,ÄÖÜäöüßa-zA-Z0-9-]+)$ results.php?searchtext=$2&start=%1&count=%2

    RewriteCond %{QUERY_STRING} ^start=([0-9]+)&count=([0-9]+)$

    RewriteRule ^(['\s+,ÄÖÜäöüßa-zA-Z0-9-]+)$ results.php?searchtext=$1&start=%1&count=%2

    Deine Erwartung an die Uncodiertheit einer URL ist schon faszinierend.
    Warum listest du hier alle möglichen dir einfallenden Sonderzeichen auf? Warum nimmst du nicht einfach den . als universelles Regex-Zeichen? Das Ergebnis dürfte identisch sein. Allenfalls wäre eine negativ ausschließende Zeichenklasse denkbar, die die Zeichen enthält, die nicht vorkommen dürfen, also beispielsweise der Slash: [^/]

    - Sven Rautenberg

    1. Hallo Sven,

      Ist schon erstaunlich, was man alles sehen kann, wenn man nicht auf die Bäume achtet :) Ich habe Deinem Rat folgend den Suchbegriff mit ^(.+)$ abgefangen. Das macht die Sache auf jeden Fall viel einfacher. Vielen Dank dafür!

      Jetzt habe ich nur noch das (kleinere) Problem, dass es auf dem Server, nicht aber in meiner lokalen Entwicklungsumgebung nicht funktioniert. Hast Du dazu vielleicht auch einen Tipp?

      Danke,
      Constantin

      Moin!

      »» Dafür steht in meiner .htaccess
      »» RewriteCond %{QUERY_STRING} ^start=([0-9]+)&count=([0-9]+)$
      »»
      »» RewriteRule ^(['\s+/,ÄÖÜäöüßa-zA-Z0-9-]*)/(['\s+,ÄÖÜäöüßa-zA-Z0-9-]+)$ results.php?searchtext=$2&start=%1&count=%2
      »»
      »» RewriteCond %{QUERY_STRING} ^start=([0-9]+)&count=([0-9]+)$
      »»
      »» RewriteRule ^(['\s+,ÄÖÜäöüßa-zA-Z0-9-]+)$ results.php?searchtext=$1&start=%1&count=%2

      Deine Erwartung an die Uncodiertheit einer URL ist schon faszinierend.
      Warum listest du hier alle möglichen dir einfallenden Sonderzeichen auf? Warum nimmst du nicht einfach den . als universelles Regex-Zeichen? Das Ergebnis dürfte identisch sein. Allenfalls wäre eine negativ ausschließende Zeichenklasse denkbar, die die Zeichen enthält, die nicht vorkommen dürfen, also beispielsweise der Slash: [^/]

      • Sven Rautenberg
  3. Hi,

    http://meinServer/"Microsoft Word"?start=0&count=10

    Du meinst sicher

    http://example.com/%22Microsoft+Word%22?start=0&count=10

    Denn die von Dir genannte URL ist ungültig.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi Cheatah,

      Danke Dir, Du hast natürlich recht mit der korrekten URL, aber egal, ob ich es mit
      http://search_local/%22Microsoft+Word%22?start=0&count=10
      oder
      http://search_local/"Microsoft+Word"?start=0&count=10
      probiere, auf meiner lokalen Maschine geht beides nicht. Nur damit keine Mißveständnisse aufkommen: Es geht mir nur um die Anführungszeichen. Diese funktionieren jetzt auf dem Internet-Server, aber nicht lokal. Ohne die Anführungszeichen funzt es auch lokal, merkwürdigerweise ...

      Hi,

      »» http://meinServer/"Microsoft Word"?start=0&count=10

      Du meinst sicher

      http://example.com/%22Microsoft+Word%22?start=0&count=10

      Denn die von Dir genannte URL ist ungültig.

      Cheatah

      1. Hi,

        egal, ob ich es mit
        http://search_local/%22Microsoft+Word%22?start=0&count=10
        oder
        http://search_local/"Microsoft+Word"?start=0&count=10
        probiere, auf meiner lokalen Maschine geht beides nicht.

        Dann konsultiere die relevanten Log-Dateien - Access-, Error-, und Rewrite-Log - um erst mal zu ermitteln, an welcher Stelle etwas schief geht.

        Kommt der Request bspw. ueberhaupt erst mal bis zu der Stelle, an der Rewriting stattfindet, oder wird er vielleicht vorher schon abgewiesen; in wie fern "verfaelscht" ihn ggf. der Client in irgendetwas unerwartetes, etc.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Hi ChrisB,

          Danke Dir für den Tipp. In meinem lokalen xamp Verzeichnis finde ich eine access.log und eine error.log. Leider keine rewrite.log. Hier die betreffenden Meldungen:

          access.log unter xamp (windows, lokale Umgebung):
          127.0.0.1 - - [07/Mar/2009:18:11:23 +0100] "GET /%22microsoft%20word%22?start=0&count=10&suchoption=1 HTTP/1.1" 403 1201

          error.log unter xamp
          [Sat Mar 07 18:11:23 2009] [error] [client 127.0.0.1] (20024)The given path is misformatted or contained invalid characters: Cannot map GET /%22microsoft%20word%22?start=0&count=10&suchoption=1 HTTP/1.1 to file, referer: http://fobis_local/

          Also, ich kann daraus nicht wirklich etwas lesen, nur dass die URL lokal einen 403-Fehler produziert. Kannst Du etwas damit anfangen?

          Die Meldungen wurden unter folgenden rewrite-Regeln erzeugt:
          RewriteCond %{QUERY_STRING} ^start=([0-9]+)&count=([0-9]+)&suchoption=(.*)$
          RewriteRule ^(.+)/(.+[^/])$ results.php?searchtext=$2&start=%1&count=%2&suchoption=%3
          RewriteCond %{QUERY_STRING} ^start=([0-9]+)&count=([0-9]+)&suchoption=(.*)$
          RewriteRule ^(.+[^/])$ results.php?searchtext=$1&start=%1&count=%2&suchoption=%3

          Auf dem Internet-Server funktioniert es nach wie vor ... hä?!?

          Gruß & Danke,
          Constantin

          Hi,

          »» egal, ob ich es mit
          »» http://search_local/%22Microsoft+Word%22?start=0&count=10
          »» oder
          »» http://search_local/"Microsoft+Word"?start=0&count=10
          »» probiere, auf meiner lokalen Maschine geht beides nicht.

          Dann konsultiere die relevanten Log-Dateien - Access-, Error-, und Rewrite-Log - um erst mal zu ermitteln, an welcher Stelle etwas schief geht.

          Kommt der Request bspw. ueberhaupt erst mal bis zu der Stelle, an der Rewriting stattfindet, oder wird er vielleicht vorher schon abgewiesen; in wie fern "verfaelscht" ihn ggf. der Client in irgendetwas unerwartetes, etc.

          MfG ChrisB

          1. Hallo,

            access.log unter xamp (windows, lokale Umgebung):
            127.0.0.1 - - [07/Mar/2009:18:11:23 +0100] "GET /%22microsoft%20word%22?start=0&count=10&suchoption=1 HTTP/1.1" 403 1201

            ja fein, der Request auf /%22microsoft%20word%22 geht also durch und bringt noch die URL-Parameter start=0, count=10 und suchoption=1 mit. Offensichtlich wurde keine deiner Rewrite Rules angewendet.

            error.log unter xamp
            [Sat Mar 07 18:11:23 2009] [error] [client 127.0.0.1] (20024)The given path is misformatted or contained invalid characters: Cannot map GET /%22microsoft%20word%22?start=0&count=10&suchoption=1 HTTP/1.1 to file, referer: http://fobis_local/

            Dein Apache teilt dir mit, dass er /%22microsoft%20word%22 nicht auf eine Datei abbilden konnte, weil ungültige Zeichen drin sind. Und ja, unter Windows sind Anführungszeichen im Dateinamen tatsächlich nicht zulässig. Also kann der Apache den Request nicht bedienen.

            Dass er mit 403 antwortet, finde ich etwas seltsam; ich hätte in der Situation eher 404 oder eventuell 500 erwartet. Aber vielleicht antwortet das Filesystem von Windows schon mit "Access denied", was der Apache dann korrekterweise in einen 403er umsetzt.

            Die Meldungen wurden unter folgenden rewrite-Regeln erzeugt:
            RewriteCond %{QUERY_STRING} ^start=([0-9]+)&count=([0-9]+)&suchoption=(.*)$
            RewriteRule ^(.+)/(.+[^/])$ results.php?searchtext=$2&start=%1&count=%2&suchoption=%3

            Diese Rewrite Rule matcht nicht auf dein URL-Beispiel: /"Microsoft Word"
            Dann dein Regex fordert immer noch:

            "Mindestens ein beliebiges Zeichen am Anfang, gefolgt von einem Slash, gefolgt von mindestens einem weiteren beliebigen Zeichen, am Ende ein Zeichen, das kein Slash ist." Das passt nicht auf den obigen URL-Ausdruck.

            RewriteCond %{QUERY_STRING} ^start=([0-9]+)&count=([0-9]+)&suchoption=(.*)$

            Dieselbe Bedingung wie oben noch einmal? Wozu das?

            RewriteRule ^(.+[^/])$ results.php?searchtext=$1&start=%1&count=%2&suchoption=%3

            "Ein bis beliebig viele Zeichen, gefolgt von einem Zeichen, das kein Slash ist."
            Das würde zutreffen, kommt aber offensichtlich doch nicht zur Anwendung. Jetzt wäre noch das Rewrite Log spannend.

            »» Hi,
            »» [...]
            »» MfG ChrisB

            Und zitiere in Zukunft bitte sinnvoll, unterlasse vor allem die unanständigen Fullquotes. Danke.

            So long,
             Martin

            --
            In der Theorie stimmen Theorie und Praxis genau überein.
            1. Hi,

              »» RewriteCond %{QUERY_STRING} ^start=([0-9]+)&count=([0-9]+)&suchoption=(.*)$
              »» RewriteRule ^(.+)/(.+[^/])$ results.php?searchtext=$2&start=%1&count=%2&suchoption=%3

              »» RewriteCond %{QUERY_STRING} ^start=([0-9]+)&count=([0-9]+)&suchoption=(.*)$

              Dieselbe Bedingung wie oben noch einmal? Wozu das?

              Um auch hier weider Zugriff auf die Werte der Parameter zu haben.

              »» RewriteRule ^(.+[^/])$ results.php?searchtext=$1&start=%1&count=%2&suchoption=%3

              Denn sonst wären die hier m.W. nicht verfügbar.

              Vermutlich wäre aber [QSA] sinnvoller.

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              O o ostern ...
              Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          2. Hi,

            Danke Dir für den Tipp. In meinem lokalen xamp Verzeichnis finde ich eine access.log und eine error.log. Leider keine rewrite.log.

            Abgesehen davon, dass letzteres hier wohl inzwischen auch nichts zur Problemfindung beitragen wird, weil wie ich schon vermutet hatte die Fehlerstelle schon vor dem Rewriting liegt - das Rewrite-Log wäre zunächst mal explizit zu aktivieren, siehe auch die RewriteLog- und RewriteLogLevel-Direktive in der Doku zu mod_rewrite.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
  4. Hallo,

    nachdem es ja auf dem Internet-Server funktioniert, liegt die Ursache wohl im Windows-Dateisystem und dann ist da wohl nichts zu machen.
    Immerhin weiß ich jetzt mehr über das Rewriting (inklusive logging), und konnte dank Eurer Tipps noch die Regeln etwas verbessern:

    RewriteCond %{QUERY_STRING} ^start=([0-9]+)&count=([0-9]+)&suchoption=(.*)$
    RewriteRule ^(.+)/(.+)$ results.php?searchtext=$2&start=%1&count=%2&suchoption=%3
    RewriteCond %{QUERY_STRING} ^start=([0-9]+)&count=([0-9]+)&suchoption=(.*)$
    RewriteRule ^(.+)$ results.php?searchtext=$1&start=%1&count=%2&suchoption=%3

    Mit QSA anstelle der URL-Parameter-Orgie funktioniert es auch, aber es schien mir langsamer zu sein.

    Vielen Dank für Eure Hilfe!