Seite 1 von 1

modrewite regel - was ist hier falsch ?

Verfasst: 06.10.2006, 21:05
von tango

Code: Alles auswählen

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.deineseite.de$
RewriteRule ^(.*)$ http://www.deineseite.de/$1 [L,R=301]

RewriteCond %{THE_REQUEST} modules.php?name=Downloads HTTP
RewriteRule ^.*$ http://www.deineseite.de/index.php [R=301,L]
bekommen einen Internal Server Error :-?

Verfasst:
von

Re: modrewite regel - was ist hier falsch ?

Verfasst: 07.10.2006, 11:17
von haha
tango hat geschrieben:bekommen einen Internal Server Error :-?
Ein genauerer Grund steht immer im Fehlerprotokoll des Webservers, die Meldung im Browser dient nur zur allgemeinen Information der Besucher.

Verfasst: 07.10.2006, 14:34
von tango
Fehlermeldung:
RewriteCond: bad flag delimiters

Verfasst:
von

Verfasst: 07.10.2006, 16:45
von DDHS
Was möchtest du denn damit erreichen? Ergibt für mich auf die schnelle keinen Sinn.
Sag bescheid, was du machen willst und es wird dir sicherlich geholfen.

Gruß DD

Verfasst: 07.10.2006, 16:53
von tango
Es sollen alle Seiten wo ein "modules.php?name=Downloads" in Link vorkommt auf die index.php umgeleitet werden. Diese Seiten sollen aus dem INDEX bei Google verschwinden. Ziel ist es DC zu vermeiden.

Verfasst: 07.10.2006, 17:36
von haha
tango hat geschrieben:Fehlermeldung:
RewriteCond: bad flag delimiters
Dann schau Dir Deine beiden RewriteCond-Zeilen nochmal an und vergleiche sie mit der Vorgabe in der Apache-Anleitung. Achte insbesondere darauf, mit welchem Zeichen einzelne Argumente bei Apache-Konfigurationsanweisungen voneinander getrennt werden und überlege Dir, was passiert, wenn ein Argument ausgerechnet dieses Zeichen enthält. Die Optionen (Flags) werden als drittes Argument erwartet, zähle vielleicht auch einfach ab, welches Argument das Dritte ist.

Davon abgesehen:

- Sofern index.php die Standardseite für Verzeichnisse ist, möchtest Du nicht zu einer index.php weiterleiten, sondern stattdessen die URL einfach am Schrägstrich enden lassen.

- Es ist etwas unüblich, erst mit RewriteCond die ganze HTTP-Anfrage zum Vergleich heranzuziehen und dann "alle" URLs (".*") mit RewriteRule umzuleiten.
Nicht, dass das nicht ginge, aber URL-Parameter lassen sich auch mit der RewriteCond-Variablen QUERY_STRING abfragen, der URL-Pfad gehört dann in das RewriteRule-Muster.

- Wenn Seiten aus dem Index verschwinden sollen, dann liefere besser einen 404- oder 410-Fehler aus, keine Weiterleitung.

Verfasst: 08.10.2006, 16:56
von tango
puuuuuuh, das ist aber viel stoff :oops:

wie wäre es damit:
RewriteCond %{HTTP_HOST} !^domain\.de/modules.php?name=Downloads
RewriteRule ^(.*) https://www.domain.de/index.php [L,R=301]


Leider bekomme ich hier eine Weiterleitung auf eine Weiterleitung :-?

Folgendes steht noch in der .htacess:

RewriteRule ^index.html index.php
RewriteRule ^gate.* modules.php

Verfasst: 08.10.2006, 18:27
von DDHS
RewriteRule ^index.php$ modules.php?name=Downloads

grundsätzlich wird das so gemacht, allerdings kann ich dir da auch nicht genau helfen, da ich dazu wissen müsste, was für URLs es gibt.

Gruß DD

Verfasst: 08.10.2006, 20:37
von tango
Die Links sind so aufgebaut: modules.php?name=Downloadsxxxxxxxxxxx

Wichtig ist sobald diese Zeichenfolge "modules.php?name=Downloads" vorkommt soll nach index.php umgeleitet werden

Verfasst: 09.10.2006, 12:00
von haha
tango hat geschrieben:RewriteCond %{HTTP_HOST} !^domain\.de/modules.php?name=Downloads
RewriteRule ^(.*) https://www.domain.de/index.php [L,R=301]

Leider bekomme ich hier eine Weiterleitung auf eine Weiterleitung :-?
Das ist kein Wunder. In HTTP_HOST steht der Hostname des Webservers, meinetwegen "heise.de" oder "example.com". Du hast eine ganze URL reingepackt und mittels ! vor dem Muster RewriteCond angewiesen, aktiv zu werden, wenn HTTP_HOST nicht dieser URL entspricht - was immer zutrifft, weil in HTTP_HOST überhaupt keine URLs abgelegt werden. Ergebnis: Alles wird umgeleitet.

Dein Fehler liegt in der zweiten RewriteCond-Zeile:

RewriteCond %{THE_REQUEST} modules.php?name=Downloads HTTP

In Konfigurationsanweisungen werden einzelne Argumente mit einem (oder mehreren) Leerzeichen getrennt. Schaust Du Dir die Zeile mal an, wirst Du feststellen, dass Du da drei Argumente drin hast:

1. %{THE_REQUEST}
2. modules.php?name=Downloads
3. HTTP

RewriteCond akzeptiert als drittes Argument eine Handvoll Optionen in eckigen Klammern. "HTTP" sitzt nicht in eckigen Klammern, was zur Fehlermeldung "bad flag delimiters", "falsche Optionsbegrenzungen" führt. Und obendrein ist "HTTP" keine Option.
Richtig wäre gewesen, das zweite Argument, welches Leerzeichen enthält, in Anführungszeichen zu setzen:

RewriteCond %{THE_REQUEST} "modules.php?name=Downloads HTTP"

Die aus bereits genannten Gründen IMHO so ziemlich ganz korrekte Art und Weise sollte hingegen diese sein:

RewriteCond %{QUERY_STRING} (^|&;)name=Downloads
RewriteRule ^modules\.php$ https://www.deineseite.de/ [R=301,L]


Mittels RewriteCond werden nur die URL-Parameter (alles hinter dem Fragezeichen) auf ein Vorkommen von "name=Downloads" geprüft, bei Zutreffen wird anschließend der URL-Pfad "modules.php" Richtung Wurzelverzeichnis weitergeleitet (ohne die überflüssige index.php-Angabe).

Da das Ganze in einer .htaccess untergebracht ist, gehört noch die Zeile

RewriteBase /

unter RewriteEngine on (RewriteBase gibt das Verzeichnis an, in der die betreffene .htaccess liegt, in diesem Fall das Wurzelverzeichnis).

Verfasst: 10.10.2006, 22:59
von tango
Hi,
vielen Dank für deine ausführliche Antwort. Ich habe es am Anfang mit %{QUERY_STRING} versucht.
Es wurde mir dann zum Anderen geraten warum auch immer. Leider funktioniert die Regel noch nicht. Es wird zwar auf die index.php geleitet aber im Browser steht:

h**p://www.deinseite.de/?name=Downloads

Was bedeutet "&;" ? Ich habe es in der Syntax von mod_rewrite nicht gefunden.

Verfasst: 11.10.2006, 10:20
von haha
tango hat geschrieben:Es wird zwar auf die index.php geleitet aber im Browser steht: h**p://www.deinseite.de/?name=Downloads
Hänge noch ein Fragezeichen an die Ziel-URL an, dann sollte der Parameterteil verschwinden.
Was bedeutet "&;"? Ich habe es in der Syntax von mod_rewrite nicht gefunden.
Da habe ich auch noch einen Fehler gemacht, &; muss in eckige Klammern gesetzt werden - war wohl nicht mein Tag.

(^|[&;])name= bedeutet "Textanfang (^), oder (|) ein Und oder Semikolon ([&;]), dann folgt der Text name=. Die runde Klammer klammert den Oder-Ausdruck, begrenzt ihn also auf die Wahl zwischen ^ und [&;]. Die eckige Klammer steht für exakt ein Zeichen aus der in ihr enthaltenen Auswahl (hier: Und und Semikolon). Das Dach steht für überhaupt kein Zeichen, an dieser Stelle muss der Text beginnen.

Dieses Muster passt auf alle Texte, die entweder mit name= beginnen (^name=) oder in denen name= auf ein Und oder Semikolon folgt (&name= oder ;name=).
Wie Du sicherlich weißt, werden einzelne Parameter in URLs durch ein Und oder Semikolon getrennt. Mit diesem Muster kannst Du daher auf jedes Vorkommen des Parameters name prüfen, und zwar egal wo in der Parameterkette er steht und - das ist der Witz an dem führenden ^|[&;] - ohne dabei über Parameter zu stolpern, die lediglich auf name enden, zB vorname, nachname oder dergleichen.
Das Muster würde auf name=bla, test=1&name=bla oder ;name=bla passen, nicht jedoch auf vorname=bla oder test=2;nachname=bla.

Das Ganze nennt sich regulärer Ausdruck. Die Dinger werden Dir an Stellen, wo Zeichenketten auf Übereinstimmung mit einem bestimmten Muster überprüft werden sollen, sehr häufig begegnen, sogar in der Suchfunktion einiger Texteditoren bzw. Textverarbeitungen, daher sind sie in der Apache-Anleitung auch nur ansatzweise erklärt.
Das Grundprinzip wird in einem Wikipedia-Artikel ganz vernünftig erklärt. Es gibt eine Funktionsbibliothek namens PCRE, die für die Auswertung dieser Muster fast immer zum Einsatz kommt und auch vom Apache verwendet wird. PCRE-Muster bieten noch eine Reihe weiterer Möglichkeiten.

Im Ganzen sollte Dein Muster also so aussehen:

RewriteCond %{QUERY_STRING} (^|[&;])name=Downloads
RewriteRule ^modules\.php$ httр://example.com/? [R=301,L]


(Ich hab's diesmal ausprobiert, bei mir funktioniert es.)

Verfasst: 11.10.2006, 17:58
von tango
Also bei mir funktioniert diese Regel nicht.
Ich habe sie jetzt so abgeändert damit es läuft:

RewriteCond %{QUERY_STRING} (^|[&;])name=Downloads
RewriteRule ^modules\.php$ index.php? [R=301,L]

Ich habe jetzt aber das Problem daß alle Seiten aus dem Modul auf index.php umgeleitet werden :-?
Die Regel müsste ergänzt werden und zwar so dass sie nur auf externe Links zutrifft. Werden Links von meiner Domain aufgerufen darf diese Regel nicht greifen da 300 gleiche Index-Seiten auf die Dauer ziemlich langweilig sind :D

Also doch zusätzlich mit RewriteCond %{HTTP_HOST} ??