Conny: #!/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.

hallo soenk.e,
danke für die Anleitung und den hinweis.Vor lauter Bäumen sah ich den
wald nicht mehr :-)

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:

nö die addresse index.cgi soll angezeigt werden und dann durch das cgi diese html's anzeigen,weil das cgi
eigentlich eine frameset ausgabe ist.

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:

Ja ich versteh es gibt tatsächlich eine endlosschleife durch den oben genannten
RewriteBase /
RewriteRule .* index.cgi [L]
befehl in der htaccess.Aber ich habs so geändert
RewriteRule .html index.cgi [L]
was widerum ne endlosschleife bewirkt wenn das html im cgi aufgerufen wird.

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

muss oder kann dieser pfad zusätzlich eingefügt werden?

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.

ja das hab ich schon gesehen und verstanden,aber ich denke es wird nicht gehen was ich haben möchte.

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 :)

Trotzdem besten dank
für die Hinweise,jedenfalls hab ich da wieder mal etwas
gelernt :-) gruss Conny

Gruß,
  soenk.e