RewriteRule in der Htaccess - Frage

rongador

Commander
Registriert
Mai 2011
Beiträge
2.354
Hi,

eine kurze Frage mit einem Beispiel:

Sagen wir einmal, www.seitenname.de/artikel/thema möchte ich per RwwriteRule in der Htaccess per 301 umleiten zu www.seitenname.de/thema, dann würde der Eintrag so aussehen:

Code:
RewriteRule ^artikel/thema(.*)$ thema [L,R=301]

Das funktioniert auch wunderbar. Mein aktuelles Problem: Die jeweilige Seite "thema" hat auch einen RSS-Feed, der entsprechend per thema/feed aufgerufen wird. Leider funktioniert dieser Feed nicht mehr, wenn ich oben genannte RewriteRule anwende. Wie genau kann ich festlegen, dass z.B. EXAKT nur "artikel/thema" umgeleitet wird, aber z.B. nicht "artikel/thema/feed"?

Weitere Frage:

Wenn die Url www.seitenname.de/thema aufgerufen wird, möchte ich, dass diese Adresse per 301 zur Startseite umgeleitet wird, also zu www.seitenname.de - hier habe ich bislang Folgendes verwendet:

Code:
RewriteRule ^thema / [L,R=301]

Funktioniert auch gut, aber ist das so korrekt?

Wichtig ist mir vor allem das Problem mit den Feeds.

Gruß
 
Das mit dem Cache ist mir auch aufgefallen, ist halt leider so :-) Leider komme ich mit Deinem Link nicht klar :-/
 
Die Notation
Code:
^artikel/thema(?!/feed)
erlaubt dir, den Pfad artikel/thema zu matchen, aber nur, wenn danach nicht /feed folgt. Das kannst du z.B. als RewriteCond über deine RewriteRule stellen, um feeds auszuschließen.

Alternative: eine RewriteRule, die genau den feed-Pfad match darüber platzieren und mit L-flag (das in den Klammern) versehen, damit da einfach nichts mit passiert.
 
Zuletzt bearbeitet:
Wie würde diese RewriteCond denn dann lauten? Also sollte das direkt unter RewriteEngine on?
 
Code:
RewriteCond %{REQUEST_URI} !/feed
RewriteRule ^artikel/thema(.*)$ thema [L,R=301]
Probier es mal damit.

Disclaimer: Alles ungetestet und ich hab das schon Jahre nicht mehr gemacht.
 
Code:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !/feed
RewriteRule ^artikel/thema(.*)$ thema [L,R=301]
RewriteRule ^artikel / [L,R=301]
</IfModule>

So sieht es aktuell aus. Ich möchte also, dass z.B. die Seite "artikel/thema" direkt zur Seite "thema" umgeleitet wird. Aber auch, wenn nur "artikel" aufgerufen wird, soll umgeleitet werden, allerdings zur Startseite, daher nur das "/", wenn man also z.B. seitenname.de/artikel eingibt, wird seitenname.de aufgerufen.

Trotz

Code:
RewriteCond %{REQUEST_URI} !/feed

wird beim Aufrufen von seitenname.de/artikel/thema/feed einfach nur seitenname.de/artikel/thema aufgerufen, aber nicht der Feed :-/
Ergänzung ()

PS: Ja, hatte den gesamten Cache geleert.
 
Falls nicht zufällig jemand anderes sieht, warum das bei dir scheitert, hilft am besten das RewriteLog zu aktivieren. Wie das geht, hängt aber sehr von deinem Setup ab und wenn du bei einem Hoster bist und den Apache nicht selbst betreibst, kommst du ggf. gar nicht ran und musst das in einem lokalen XAMPP (oder eben einem einzelnen Apache) testen.

In diesem Log siehst du Schritt für Schritt, was der Apache aus deinen Rewrite-Regeln macht und erkennst, wo der Fehler liegt.

P.S.: da ich dein Setup nicht kenne - es kann auch ein cachender Proxy oder gar ein CDN des Hosters dazwischen sein. Das erkennt man in der Regel an den Response-Headern in der F12-Konsole, aber das führt wohl zu weit. Ist leider schwer per Ferndiagnose.
 
Zuletzt bearbeitet:
Da komme ich leider nicht dran und XAMPP installiere ich nicht. Erkennst Du also z.b. nichts an dem oben stehendem Code?
Ergänzung ()

Es läuft einfach nicht :-/
 
Slash bei "thema" fehlt auf jeden Fall, das Redirect-Ziel wird immer absolut angegeben (zumindest wenn ich die Dokumentation gerade richtig deute)

Edit: Achso, ja klar. Sorry, ist zu spät am Abend, ich hab jetzt erst dein Problem kapiert ;)

Eine gute Seite zum schnell ausprobieren: https://htaccess.madewithlove.be/

Ich schaue gerade aber auch noch...

Edit 2:
So. Einfacher, als ich gedacht hab. Jetzt werden zumindest alle Themen weitergeleitet, wie das mit Feed etc ist, weiß ich nicht, das wolltest du nicht weiterleiten?

Code:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !/feed
RewriteRule ^artikel/thema/(.*)$ /thema/$1 [L,R=301]
RewriteRule ^artikel / [L,R=301]
</IfModule>

PS: Erläuterung - alle Expressions, wie z.B. (.*) werden in durchnummerierten Variablen gespeichert. Da das die erste Expression in der Regel ist, wird das Ergebnis in der Variable $1 gespeichert.
 
Zuletzt bearbeitet:
Die Weiterleitungen funktionieren ja einwandfrei, nur sorgt eben das (.*) dafür, dass alle Urls, die mit seitenname.de/artikel/thema beginnen, zum Ziel umgeleitet werden, so eben auch seitenname.de/artikel/thema/feed. Ich kann also z.B. auch seitenname.de/artikel/thema/h62672g2hj22 aufrufen, diese Adresse würde umgeleitet werden zu seitenname.de/thema

Ich möchte einfach ausschließen, dass auch Adressen mit /feed am Ende umgeleitet werden.
Ergänzung ()

Die Weiterleitungen funktionieren ja bereits einwandfrei. Ich möchte nur verhindern dass auch die URLs mit /feed am Ende umgeleitet werden. Stattdessen soll ja der jeweilige Feed geladen werden.

Also ich habe es jetzt zumindest geschafft, dass aus

seitenname.de/artikel/thema/feed

immerhin KEIN

seitenname.de/thema

mehr wird. Jetzt wird aus

seitenname.de/artikel/thema/feed

ein

seitenname.de/thema/feed

Das bringt allerdings nichts, weil es dort keinen Feed gibt :-) Mist. Scheint komplizierter als ich dachte. Ich muss ja das /artikel/ in der URL behalten.
 
Ok, jetzt sollte es auch mit dem Feed funktionieren:

Code:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_URI} /feed
RewriteRule ".?" "-" [S=2]

RewriteRule ^artikel/thema/(.*)$ /thema/$1 [L,R=301]
RewriteRule ^artikel / [L,R=301]
</IfModule>

Also die Condition zählt immer nur für die nachfolgende Regel. Deswegen wird jetzt, falls die URL / URI "feed" enthält, eine Regel ausgeführt, die einfach die nächsten zwei Regeln überspringt.

Der Online-Tester scheint die Skip-Flag aber offenbar nicht zu beherrschen :/

Lg
 
Bevor ich es ausprobiere: Muss denn vor dem /feed in der 5. Zeile kein ! davor?
Ergänzung ()

Hmm, aber was, wenn ich eine ganze Reihe solcher Regeln habe? In meinem Fall sind es sogar 6 Umleitungs-Regeln, welche auch von diesem Feed-Problem betroffen sind.
Ergänzung ()

Code:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !/feed
RewriteRule ^thema-alt(.*)$ thema-neu [L,R=301]
RewriteRule ^thema123-alt(.*)$ thema-neu123 [L,R=301]
(...usw...)
RewriteRule ^artikel/thema123(.*)$ thema123$1 [L,R=301]
RewriteRule ^artikel/thema456(.*)$ thema456 [L,R=301]
RewriteRule ^artikel/thema789(.*)$ thema789 [L,R=301]
(...usw...)
RewriteRule ^artikel / [L,R=301]
</IfModule>

So sieht es vereinfacht derzeit bei mir aus.
Ergänzung ()

Da bringt es also nichts, per Zahl eine bestimmte Menge an Regeln zu überspringen. Es können ja auch jederzeit neue Regeln hinzukommen in Zukunft.
 
Naja, das ist ja schon wieder Blödsinn ;)

Du leitest ja immer nach bestimmter Struktur um, das heißt auch hier eignen sich Variablen:
Code:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
 
RewriteCond %{REQUEST_URI} /feed
RewriteRule ".?" "-" [S=3]

RewriteRule ^artikel/(.*)$ /$1 [L,R=301]
RewriteRule ^artikel/(.*)/(.*)$ /$1/$2 [L,R=301]
RewriteRule ^artikel / [L,R=301]
</IfModule>

Leitet /artikel/abc/def zu /abc/def um,
/artikel/xyz zu /xyz um,
/artikel zu / um.

Ansonsten könnte es auch mit der END-Flag funktionieren, die habe ich allerdings noch nie benutzt:
Code:
RewriteCond %{REQUEST_URI} /feed
RewriteRule ".?" "-" [END]
 
Zuletzt bearbeitet:
@rongador: Was ich in #4 als Alternative erwähnte. Du platzierst relativ weit oben in deinen Regeln
Code:
RewriteRule ^.*/feed - [L]
was bewirkt, dass alle feed-URLs einfach unangetastet bleiben. Das spart all das Gefrickel danach.
 
Es ist ist nicht immer dasselbe Schema, ich leite ja auch z.B. von einem alten permalink (z.B. "themaABC") zu einem ganz anderen permalink um (z.B. "affehundfisch"). Hm.
Ergänzung ()

@Tumbleweed: Dein Tipp funktioniert, die Seiten werden korrekt weitergeleitet, die URLs mit /feed am Ende bleiben unangetastet. Komischerweise erscheint nun aber eine 404 Fehlermeldung, wenn die Feed-Url aufgerufen wird (was nicht sein kann, da die Feeds immer ordentlich funktioniert haben.
Ergänzung ()

Die Feed-Adresse funktioniert nach dem Einfügen von

RewriteRule ^.*/feed - [L]

nicht mehr. Habe ich getestet (ich habe vorübergehend einfach mal die normale Umleitung wieder rausgenommen, Cache geleert und so weiter. Mit RewriteRule ^.*/feed - [L] funktioniert der Feed gar nicht mehr, trotz dann identischer Adresse.
Ergänzung ()

Es funktioniert jetzt schlichtweg gar kein Feed mehr. Selbst die von den ganzen normalen "Tags", die gar nichts mit den Umleitungen zu tun haben. Jeglicher Feed wirft jetzt einen 404 Fehler raus. Super.
 
Tumbleweed schrieb:
Und vorsicht mit 301ern. Die werden gecacht vom Browser.

Auch wenn man
Code:
Cache-Control: max-age=0
bzw.
Code:
Pragma: no-cache

mitschickt?
Ergänzung ()

rongador schrieb:
Da komme ich leider nicht dran und XAMPP installiere ich nicht.
Das heißt, Du verweigerst die Mitarbeit bei der Lösung Deines Problems.

Abgesehen davon, dass ne Testumgebung sinnvoller wäre, als am offenen Herzen (Produktivserver) herumzufummeln.
 
Ich verweigere nichts, ich halte nur nichts von XAMPP und arbeitet tatsächlich "live" an meiner Webseite. Es ging mir bei meiner Frage lediglich darum, wie ich effektiv ausschließen kann, dass auch die Feed-Adressen umgeleitet werden. Tumbleweed gab einen sehr wertvollen Tipp, der funktionierte, aber leider auch dazu führte, dass trotz korrekter Feed-Adresse diese Feeds nicht mehr abrufbar waren (Fehler 404).
 
Zurück
Oben