Stefan Einspender: RedirectMatch mit Ausnahme

Hallo ForumsleserInnen,

wie kann ich erreichen, dass für die robots.txt nicht der Statuscode
410 sondern 200 (und eben diese Datei) an den Client verschickt wird?

Jetzt:
RedirectMatch gone ^.*$

Dann:
?

Bestimmt nicht so schwierig, aber ich komme partout nicht drauf und
danke an dieser Stelle schonmal im voraus.

Viele Grüße,
Stefan

  1. wie kann ich erreichen, dass für die robots.txt nicht der Statuscode
    410 sondern 200 (und eben diese Datei) an den Client verschickt wird?

    RedirectMatch gone /$|.*.html

    diese Zeile habe ich jetzt erstmal genommen, allerdings erfüllt sie
    nicht ganz die Aufgabe, reicht aber aus, bis mir jemand eine bessere
    Lösung vorschlägt :-)

    Viele Grüße,
    Stefan

    1. RedirectMatch gone /$|.*.html

      ein netter Chatteilnehmer hat mir eine andere Variante verraten, die
      die von mir gestellte Aufgabe perfekt erfüllt, könnte man eigentlich
      nur noch kürzen, falls möglich:

      RewriteEngine on
      RewriteCond %{REQUEST_URI} !/robots.txt$
      RewriteRule .* $1 [G,L]

      Viele Grüße,
      Stefan

  2. Hallo Forum,

    naja, nachdem Stefan jetzt seine Antwort bekommen hat, hätte ich da jetzt auch mal eine Frage zu mod_rewrite:

    Unter der URL http://localhost/~christian/sonstwas/ (lokal bei mir) habe ich eine Datei index.php abgelegt. Ich möchte nun, dass diese _alle_ Anfragen unterhalb dieses Verzeichnisses entgegennimmt.  Von daher habe ich zuerst so etwas probiert:

    RewriteEngine On
    RewriteBase /~christian/sonstwas
    RewriteRule ^(.*)$            index.php?url=$1

    Das hat jedoch den Nachteil, dass er durch 'Verkettung' auf index.php?url=index.php weiterleitet. (dann hört er auf, da er nicht auf das gleiche Ergebnis weiterleiten will) Ein [L] half nicht. Also hab' ich ein bisschen getrickst und folgendes gemacht:

    RewriteEngine On
    RewriteBase /~christian/sonstwas
    RewriteRule ^index.php(.*)    index.php$1        [S=1]
    RewriteRule ^(.*)$            index.php?url=$1   [L]

    Das klappt auch. Aber irgendwie finde ich es unschön. Aber jetzt kommt mein eigentliches Problem: Ich will, dass Zugriffe auf /images und /styles, wo *ausschließlich* statische Dateien liegen, es also hirnlos ist, das ganze durch PHP zu jagen.

    Ich habe also nun

    RewriteEngine On
    RewriteBase /~christian/sonstwas
    RewriteRule ^index.php(.*)       index.php$1        [S=2]
    RewriteRule ^(styles|images)(.*) $1$2               [S=1]
    RewriteRule ^(.*)$               index.php?url=$1   [L]

    versucht. Alles andere klappte auch, doch jedes Mal, wenn ich auf /styles oder /images zugreifen wollte, ging er in eine Endlosschleife.  Auch ein

    RewriteEngine On
    RewriteBase /~christian/sonstwas
    RewriteRule ^(index.php|styles|images))(.*)       $1$2               [S=2]
    RewriteRule ^(.*)$                                index.php?url=$1   [L]

    brachte nichts, im Gegenteil, jetzt hat er sich jedes Mal aufgehangen.

    Wo ist meine Denkblokade?

    Grüße,

    Christian

    --
    Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
    1. Hallo Christian!

      Wo ist meine Denkblokade?

      Vielleicht solltest Du mal über eine Rewrite_Cond nachdenken, also nur bei einer bestimmten Bedingung umschreiben?
      Ich kenne mich damit selbst nicht gut aus, daher lieber die Links auf
      http://httpd.apache.org/docs/mod/mod_rewrite.html#RewriteCond und
      http://httpd.apache.org/docs/misc/rewriteguide.html

      Ich stelle mir das in etwa so vor:

      RewriteCond %{REQUEST_URI}  ^/images/.*  [OR]
      RewriteCond %{REQUEST_URI}  ^/styles/.*  [OR]
      RewriteCond %{REQUEST_URI}  ^/index.php.*
      RewriteRule ^(.*)$            script.php?url=$1 [L]

      So ist das nur leider genau falsch rum ;-) Man müßte die Bedingung negieren, also wenn _nicht_ /images/... aber wie das geht weiß ich nicht. Aber vielleicht hilft es Dir.

      Ich weiß nicht in wie weit RegEx hier unterstützt werden, ob man ^ auch zur Negation verwenden kann, vielleicht geht es ja.

      Ganz einfach wäre das ganze, wenn  man alle die Dateien die das betrifft in ein separates Verzeichnis legt, sowas wie /scripts/, oder - aha - ich will das sowieso mehrsprachig machen, dann mach das vielleicht einfach so:

      RewriteCond %{REQUEST_URI}  ^/(en|de|es|fr)/.*
      RewriteRule ^/(.*?)/(.*)$            script.php?url=$2&lang=$1 [L]

      Hätte ich direkt 2 Fliegen  mit einer Klappe geschlagen!

      Grüße
      Andreas

      1. Hallo Andreas,

        Vielleicht solltest Du mal über eine Rewrite_Cond nachdenken, also nur bei einer bestimmten Bedingung umschreiben?

        Jepp, das ist eine sehr gute Idee. (ich dachte RewriteCond bräuchte man nur für so was wie UserAgent - denkste ;))

        Ich stelle mir das in etwa so vor:

        RewriteCond %{REQUEST_URI}  ^/images/.*  [OR]
        RewriteCond %{REQUEST_URI}  ^/styles/.*  [OR]
        RewriteCond %{REQUEST_URI}  ^/index.php.*
        RewriteRule ^(.*)$            script.php?url=$1 [L]

        So ist das nur leider genau falsch rum ;-) Man müßte die Bedingung negieren, also wenn _nicht_ /images/... aber wie das geht weiß ich nicht. Aber vielleicht hilft es Dir.

        Das hilft mir jetzt sehr, laut Anleitung müsste

        RewriteCond %{REQUEST_URI}  !^/images/.*
        RewriteCond %{REQUEST_URI}  !^/styles/.*
        RewriteCond %{REQUEST_URI}  !^/index.php.*
        RewriteRule ^(.*)$            script.php?url=$1 [L]

        funktionieren. Kann es im Moment leider nicht testen, ich wollte eine Erweiterung meines Mozilla deinstallieren (als root) und diese Routine hat mir freundlicherweise das *komplette* /bin-Verzeichnis weggefegt - jetzt muss ich das manuell rekonstruieren... *ichinstallierenurnochdaswasichbrauche*

        Ich weiß nicht in wie weit RegEx hier unterstützt werden, ob man ^ auch zur Negation verwenden kann, vielleicht geht es ja.

        Nicht ^ sondern !, in der Anleitung zu RewriteCond stehts drin.

        RewriteCond %{REQUEST_URI}  ^/(en|de|es|fr)/.*
        RewriteRule ^/(.*?)/(.*)$            script.php?url=$2&lang=$1 [L]

        Hätte ich direkt 2 Fliegen  mit einer Klappe geschlagen!

        Genau, nur das ich das Problem habe, das bei dem Projekt, wo ich gerade daran arbeite, Mehrsprachigkeit _nicht_ gefordert ist. (sonst habe ich es auch immer so gemacht, bzw. die RewriteCond-Zeile ausgelassen und in RewriteRule halt statts (.*?) (de|en) verwendet)

        Noch ein Tipp:

        RewriteRule ^/([^/]*)/(.*)$            script.php?url=$2&lang=$1 [L]

        geht schneller. :)

        Grüße,

        Christian

        --
        Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
        1. Hallo Christian!

          Das hilft mir jetzt sehr, laut Anleitung müsste

          RewriteCond %{REQUEST_URI}  !^/images/.*
          RewriteCond %{REQUEST_URI}  !^/styles/.*
          RewriteCond %{REQUEST_URI}  !^/index.php.*
          RewriteRule ^(.*)$            script.php?url=$1 [L]

          funktionieren. Kann es im Moment leider nicht testen, ich wollte eine Erweiterung meines Mozilla deinstallieren (als root) und diese Routine hat mir freundlicherweise das *komplette* /bin-Verzeichnis weggefegt - jetzt muss ich das manuell rekonstruieren... *ichinstallierenurnochdaswasichbrauche*

          Aber Mozilla verlangt ja für jede Kleinigkeit root glaube ich mich zu erinnern, oder?

          Ach ja, noch eine kleine Verbesserung:

          *  'ornext|OR' (or next condition)
                Use this to combine rule conditions with a local OR instead of the implicit AND. Typical example:

          RewriteCond %{REMOTE_HOST}  ^host1.*  [OR]
          RewriteCond %{REMOTE_HOST}  ^host2.*  [OR]
          RewriteCond %{REMOTE_HOST}  ^host3.*
          RewriteRule ...some special stuff for any of these hosts...

          Without this flag you would have to write the cond/rule three times.

          Nicht ^ sondern !, in der Anleitung zu RewriteCond stehts drin.

          ARGH! Das hatte mir schonmal jemand gesagt, und ich habe es auch _schon_wieder_ überlesen...

          Grüße
          Andreas

          1. Hallo Andreas,

            Aber Mozilla verlangt ja für jede Kleinigkeit root glaube ich mich zu erinnern, oder?

            Wenn man so blöd ist wie ich und ihn als root installiert - ja. Ich werde ihn, sobald mein System wieder läuft (schreibe momentan unter Windows), von der Platte fegen und dann als eigener Benutzer 'mozilla' installieren - dann kann ich als dieser Benutzer die Erweiterungen draufmachen, ohne dass ich als root arbeiten muss.

            *  'ornext|OR' (or next condition)
                  Use this to combine rule conditions with a local OR instead of the implicit AND.

            Ähm, kurze Wiederholung zum Thema Logik:

            bedingung1 ODER bedingung2 ODER bedingung3

            Wenn ich _alles_ negieren will, dann habe ich folgenden Ausdruck:

            NICHT ( bedingung1 ODER bedingung2 ODER bedingung3 )

            und wenn ich das nun auflöse, so dass keine Klammer mehr da steht:

            NICHT(bedingung1) UND NICHT(bedingung2) UND NICHT(bedingung3)

            ARGH! Das hatte mir schonmal jemand gesagt, und ich habe es auch _schon_wieder_ überlesen...

            Mach' Dir nichts draus, ich bin ja auch nicht auf RewriteCond gekommen...

            Grüße,

            Christian

            --
            Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
            1. Hallo!

              Ähm, kurze Wiederholung zum Thema Logik:
              [...]

              Ähm....*schäm*...auweia....

              Damit wäre das also geklärt.

              Nochmal zum Mozilla, man erstellt also einen Benutzer Mozilla mit eigenem user/pass, dann muß man sich entweder in der shell als Mozilla einloggen, oder bei Gnome etc., und dann enstprechend installieren, oder?

              Wie ist das eigentlich mit den Benutzerdaten bei einem Update? Wie aktualisiere ich mozilla unter Linux am besten, so dass ich diese Daten, Plugins... alle behalten kann? Das Java-Plugin war nämlich umständlich zu installieren, aber das geht inzwischen bei 1.2.1 glaub ich auch einfacher...
              Naja, jedenfalls ist die Version 1.2.1 ein guter Grund für ein Update.

              Grüße und vielen Dank nochmal für Deine Erklärungen!
              Andreas

              1. Hallo Andreas,

                Nochmal zum Mozilla, man erstellt also einen Benutzer Mozilla mit eigenem user/pass, dann muß man sich entweder in der shell als Mozilla einloggen, oder bei Gnome etc., und dann enstprechend installieren, oder?

                Jain. Das X-Window-Sicherheitskonzept steht da noch im Wege, das erlaubt standardmäßig nur Zugriffe vom gleichen Benutzer. Ich glaube, Du kannst das Scheunentor mit 'xset +' aufreißen, bin mir aber nicht ganz sicher, schon ewig her, dass ich das gemacht habe. (ich verwende immer 'kdesu -u user programmname', das macht das ganze für mich, und öffnet nur gezielt ein Loch)

                Wie ist das eigentlich mit den Benutzerdaten bei einem Update?

                Benutzerdaten werden in ~/.mozilla gehalten. Plugins können an zwei versch. Stellen liegen, einmal unter /pfad/zu/mozilla/plugins und zum zweiten unter ~/.mozilla/plugins. Letzteres ist empfehlenswert, da die Plugins beim Update erhalten bleiben. (und jeder User andere Plugins haben kann)

                Wie aktualisiere ich mozilla unter Linux am besten, so dass ich diese Daten, Plugins... alle behalten kann?

                Alle Plugins von /pfad/zu/mozilla/plugins nach ~/.mozilla/plugins verschieben, /pfad/zu/mozilla löschen, Mozilla per Installer noch mal an den gleichen Ort (oder anderswo - ist egal) installieren, und dann dürfte alles klappen. So hat's bei mir immer funktioniert, also ohne Gewähr. (notfalls ein Backup von ~/.mozilla machen, woanders speichert Mozilla keine Profildaten) Ach ja, die Erweiterungen musst Du alle manuell nachinstallieren.

                Grüße,

                Christian

                --
                Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
        2. Hallo Andreas nochmal,

          also, gerade getestet:

          RewriteCond %{REQUEST_URI}  !^/images/.*
          RewriteCond %{REQUEST_URI}  !^/styles/.*
          RewriteCond %{REQUEST_URI}  !^/index.php.*
          RewriteRule ^(.*)$            script.php?url=$1 [L]

          Funktioniert prima, vielen Dank! Fürs Archiv wäre nur noch anzumerken, dass die letzte Zeile natürlich auf index.php und nicht auf script.php weiterleiten sollte, und dass immer das absolute Pfad zum Webserverstammbaum angegeben werden muss, also bei mir /~christian/sonstwas/images/ anstelle von /images, etc.

          Grüße,

          Christian

          --
          Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.
    2. RewriteEngine On
      RewriteBase /~christian/sonstwas
      RewriteRule ^(index.php|styles|images))(.*)       $1$2               [S=2]

      ^
                                              |
                 Vielleicht deswegen? --------+

      RewriteRule ^(.*)$                                index.php?url=$1   [L]

      Grüße
      Andreas

      1. Hallo Andreas,

        RewriteEngine On
        RewriteBase /~christian/sonstwas
        RewriteRule ^(index.php|styles|images))(.*)       $1$2               [S=2]
                                                ^
                                                |
                   Vielleicht deswegen? --------+

        Du meinst die Klammer? (im User-Style-Sheet ist das alles verschoben, von daher bitte keine Markierungen mit ^ bei Zitaten, ok?) Neee, das war jetzt nur ein Typo beim Posten. :-)

        Grüße,

        Christian

        --
        Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.