Sönke Tesch: #!/usr/bin/perl einbinden in die htaccess

Beitrag lesen

Ich möchte das nur dieses cgi aufgerufen wird und keine .html seite.
Also wenn jetzt jemand die index.html aufruft oder eine andere page.html,dann sollte automatisch das cgi anstatt diese angeforderte
html seite aufgerufen werden.

Das ist kein Problem.

Dazu hab ich dies gefunden in der zwischenzeit und in die htaccess eingefügt:
RewriteEngine  on
RewriteCond %{REQUEST_FILENAME}   !-s
RewriteRule /* http://www.seite.de/index.cgi [R,L]

aber es funtz nur wenn jemand eine seite aufruft die es nicht gibt.

Logisch, schau Dir doch mal die Anleitung zu mod_rewrite an, insbesondere zu RewriteCond unter http://httpd.apache.org/docs/mod/mod_rewrite.html#RewriteCond. Dort heißt es:

Syntax: RewriteCond TestString CondPattern
  [..]

There are some special variants of CondPatterns. Instead of real
  regular expression strings you can also use one of the following:

- '-s' (is regular file with size)
    Treats the TestString as a pathname and tests if it exists and is
    a regular file with size greater than zero.

Du hast also eine Bedingung (Condition) für Deine Regel gesetzt, die besagt, daß das aktuelle Objekt keine ("keine" wegen dem ! davor) Datei mit Inhalt sein darf (-s).
In der darauf folgenden Zeile (RewriteRule ..) folgt dann die eigentliche Regel, nach der die URL geändert wird.

So, und nun darfst Du dreimal raten, wie man den Server dazu kriegt, das Umschreiben in der dritten Zeile ohne die Bedingung der zweiten Zeile auszuführen... :)

Davon abgesehen: Du kannst Dir überlegen, ob Du eine externe Umleitung haben möchtest (wie jetzt), so daß der Browser statt xyz die neue Adresse index.cgi auch anzeigt, oder ob Du lieber eine interne haben willst, so daß die Adresse im Browser gleich bleibt. In letzterem Fall müßte es folgendermaßen aussehen:

RewriteBase /
  RewriteRule .* index.cgi [L]

Hinter RewriteBase muß der HTTP-Pfad zum Verzeichnis, in dem diese .htaccess liegt, stehen. Ist der Pfad also http://server.de/.htaccess lautet RewriteBase / (wie oben), ist der Pfad http://server.de/blabla/kringel/.htaccess, lautet RewriteBase /blabla/kringel/ .
Siehe auch http://httpd.apache.org/docs/mod/mod_rewrite.html#RewriteBase.

Last but not least befürchte ich mal, daß Du Dir eine Endlosschleife bastelst, d.h. der Server bekommt URL xyz, macht daraus wie gewünscht index.cgi, und durchläuft dann die ganze Sache mit index.cgi nochmal. Bei der externen Weiterleitung müsste das auf jeden Fall so passieren, bei der internen bin ich mir nicht ganz sicher.
Falls der Browser also nicht mehr reagiert, muß die Regel so angepasst werden, daß sie auf alles reagiert, was nicht index.cgi heißt:

RewriteRule !^index.cgi$ index.cgi [L]

Das ! negiert die folgende Aussage wiederum, der Rückstrich dient dazu, dem Server zu sagen, daß der . ein Punkt ist und kein Platzhalter für "ein beliebiges Zeichen", die Bedeutung von ^ und $ solltest Du Dir in der Anleitung selber rauslesen: http://httpd.apache.org/docs/mod/mod_rewrite.html#RewriteRule.

Ich hoffe, das war halbwegs deutlich, funktioniert und daß Du auch versuchst zu verstehen, was da überhaupt passiert - dann kannst Du's nächstes Mal nämlich alleine. Vom Abschreiben lernt man nix :)

Gruß,
  soenk.e