andreas: ForceType directive

hallo zusammen.

ich hab eine rewrite regel, die die urls nach folgendem schema umschreibt:

http://domain.tld/foo -> http://domain.tld/index.php?show=foo

ist foo keine php- oder htmldatei direkt unter dem doc root, dann funktionert es wunderbar. ist es eine datei, wir sie aufgerufen, was ich  nicht möchte.

ich denke das eine force type anweisung in der httpd.conf datei (auf die ich keinen einfluss habe) steht. wie kann ich diese anweisung ausschalten? oder gibt es einen workaround?

vielen dank.

andreas

  1. http://domain.tld/foo -> http://domain.tld/index.php?show=foo

    ist foo keine php- oder htmldatei direkt unter dem doc root, dann funktionert es wunderbar. ist es eine datei, wir sie aufgerufen, was ich  nicht möchte.
    ich denke das eine force type anweisung in der httpd.conf datei (auf die ich keinen einfluss habe) steht. wie kann ich diese anweisung ausschalten? oder gibt es einen workaround?

    ForceType setzt den MIME-Typ, was soll das mit den Rewrite-Regeln zu tun haben? Wie sehen die Regeln aus? Mit der Hellseherei ist das nicht so doll hier.. ;)

    Gruß,
      soenk.e

    1. dir auch ein hellseherisches hallo :)

      meine rewrite regel:
        RewriteEngine on
        RewriteCond %{REQUEST_FILENAME} !.(gif|jpg|png|css|pdf|php)$
        RewriteRule (.+)/ index.php?show=$1

      es hat was mit forcetype zu tum, weil der server wenn er folgende url bekommt http://domain.tld/foo den mimetype von foo auf php setzt, noch bevor meine rewrite regel zum tragen kommt.

      er sollte die url aber zu ....tld/show=foo umschreiben.

      lg andraes

      1. meine rewrite regel:
          RewriteEngine on
          RewriteCond %{REQUEST_FILENAME} !.(gif|jpg|png|css|pdf|php)$
          RewriteRule (.+)/ index.php?show=$1

        es hat was mit forcetype zu tum, weil der server wenn er folgende url bekommt http://domain.tld/foo den mimetype von foo auf php setzt, noch bevor meine rewrite regel zum tragen kommt.

        ForceType hat aber AFAIK keinen Einfluss auf die URL bzw. ihre Verarbeitung, sondern ändert einfach nur den Mime-Typ. Der Mime-Typ aber wiederum hat keinerlei Einfluss auf die Rewrite-Regeln. Von daher kann das nicht zusammenhängen.

        Du hast geschrieben, daß es funktioniert, wenn foo keine HTML- oder PHP-Datei ist. Meinst Du damit, daß die Dateien "foo.html" oder "foo.php" direkt aufgerufen werden? Ich gehe mal davon aus, daß Du nicht eine Datei "foo" meinst, denn daraus kann keiner erkennen, ob es eine HTML- oder PHP-Datei ist.

        Wenn meine Annahme richtig ist, dann bedeutet das, daß in dem betreffenden Verzeichnis Multiviews aktiv ist. Der Server sucht sich also zuerst die passende Datei zur URL /foo, findet foo.php, schleust foo.php in Deine RewriteCond ein und stellt fest, daß foo.php nicht auf Dein Muster passt (der Dateiname soll ja _nicht_ auf .php enden). Bleibt nur eines übrig: Datei normal weiterverarbeiten.
        Über die Aktion bei foo.html bin ich mir nicht ganz sicher. Zwar passt das RewriteCond-Muster, aber jenes bei RewriteRule könnte wegen dem enthaltenen Schrägstrich Probleme bereiten ("(.+)/").

        Soviel zur Theorie. Praktisch hast Du erstens RewriteBase vergessen (Pflicht in jeder .htaccess, wenn mod_rewrite benutzt wird) und solltest zweitens nicht den physischen Dateinamen (REQUEST_FILENAME) prüfen, wenn die URL gar nicht auf eine physische Datei zeigt. Eigentlich sollte eine umzuschreibende URL besser gar nicht auf eine physische Datei zeigen.

        Mein Ansatz:

        RewriteEngine on
          RewriteBase /
          RewriteCond %{REQUEST_URI} !.[a-z]+$
          RewriteRule (.*) index.php?show=$1

        So in dem Dreh. Die Regel wird nur angewendet, wenn die URI ohne eine Dateiendung daher kommt. Möglicherweise noch eine Zeile

        options -multiviews

        einfügen.

        Gruß,
          soenk.e

        1. ForceType hat aber AFAIK keinen Einfluss auf die URL bzw. ihre Verarbeitung, sondern ändert einfach nur den Mime-Typ. Der Mime-Typ aber wiederum hat keinerlei Einfluss auf die Rewrite-Regeln. Von daher kann das nicht zusammenhängen.

          okay. hast recht.
          es läuft, so wie du es gesagt hast. nur leider hab ich jetzt noch das problem mit dem "trailing slash". /foo wird umgeschrieben, /foo/ leider nicht.

          vielleicht hast du da ja noch einen tipp!?

          danke, andreas

          1. ForceType hat aber AFAIK keinen Einfluss auf die URL bzw. ihre Verarbeitung

            okay. hast recht.

            Hurra, Sieg! <;)

            es läuft, so wie du es gesagt hast. nur leider hab ich jetzt noch das problem mit dem "trailing slash". /foo wird umgeschrieben, /foo/ leider nicht.

            Nanu? Bei mir funktioniert das einwandfrei: http://kino-fahrplan.de/privat/st/self/foo/ . Dank

            RewriteRule ([a-z]*) index.php?show=$1

            schnippelt er sogar alles ab dem Schrägstrich ab (siehe _GET["show"], war aber nur Spielerei). Es läuft aber auch mit der bereits vorgeschlagenen Regel "(.*)".
            Im Verzeichnis liegt übrigens auch eine foo.html, die man direkt ansteuern kann (http://kino-fahrplan.de/privat/st/self/foo.html).

            Gruß,
              soenk.e

            1. hi.

              kommando zurück. geht alles prima.
              vielen dank.

              lg andreas

  2. ich denke das eine force type anweisung in der httpd.conf datei (auf die ich keinen einfluss habe) steht. wie kann ich diese anweisung ausschalten? oder gibt es einen workaround?

    wenn du glück hast darfst du solche regeln in einer .htaccess datei "overriden". Das muss natürlich erlaubt sein.

    Wenn z.b. mod_rewite installiert ist kannst du solche spielchen direkt in der .htaccess datei erledigen.

    Das muss nur erlaubt sein. Frag deinen Provider oder probiere es halt aus....

    RewriteEngine On
            RewriteCond foobla REGexp [flags]
            RewriteRule  foobla REGexp [flags]

    Schau auf httpd.apache.org nach in der mod_rewrite doku und frag deinen provider was du in deiner .htaccess alles machen darfst...

    Das ist zumindest die _eleganteste_ lösung. Ich habe das aber noch nie in einer .htacces datei gemacht bin mir also noch nichtmal sicher ob das überhaupt geht. Aber in .htaccess kann man theoretisch ziemlich viel machen.

    So ein kleines AllowOverride All in der httpd.conf für deinen Vhost kann da echte wunder bewriken...