Seite 1 von 2

Rewrite Rule mit 301 domain.de/de/index.html nach domain.de

Verfasst: 30.09.2010, 15:05
von WoY
Servus Jungx,

'n kleines, bestimmt einfaches Problem was mir Kopfzerbrechen bereitet.

Folgendes:
Der Kunde hat bis jetzt in der Root eine .htaccess mit der RewriteRule:
RewriteRule (^index\.html$) catalog/de/ [R=301, L]

Jetzt soll folgendes passieren:

Die Umleitung soll nicht sichtbar sein, es soll nur die Startseite angezeigt werden.
Das ist ja auch kein Problem, einfach das R=301 entfernen.

Problem an der Sache:
ich benötige einen 301 Status Code, damit die bei Bedarf angelegten Links auf die alte Startseite im Unterordner catalog/de/index.html auf die Startseite weitervererbt werden.

Hat Jemand eine Idee, Alternative dies zu realisieren?=?
Danke euch, schönen Abend noch.

Verfasst:
von

Hochwertiger Linkaufbau bei ABAKUS:
  • Google-konformer Linkaufbau
  • nachhaltiges Ranking
  • Linkbuilding Angebote zu fairen Preisen
  • internationale Backlinks
Wir bieten Beratung und Umsetzung.
Jetzt anfragen: 0511 / 300325-0

Re: Rewrite Rule mit 301 domain.de/de/index.html nach domain

Verfasst: 30.09.2010, 18:19
von 800XE
WoY hat geschrieben:RewriteRule (^index\.html$) catalog/de/ [R=301, L]

Jetzt soll folgendes passieren:

Die Umleitung soll nicht sichtbar sein, es soll nur die Startseite angezeigt werden.
Das ist ja auch kein Problem, einfach das R=301 entfernen.

Problem an der Sache:
ich benötige einen 301 Status Code,
Wenn du einen "sauberern 301" willst, dann mach auch 301
also [R=301, L] drinlassen

wenn du eine "Weiterleitung" willst die keiner sieht ...
... dann hast du da schonmal keinen 301 oder 302

was für einen Code hast du jetzt?
"200" dann ist alles OK
"404" dann mach Header200, dann ist alles OK
https://mit-oder-ohne-www.de/domain-wei ... irect.html
siehe unterste TEXTarrayBOX

Verfasst: 01.10.2010, 09:29
von WoY
Morgen, danke dir für die Antwort.

Es ist eine etwas komische Zwickmühle.

Der Kunde hat am Anfang der Erstellung seiner Seite mittels .htaccess die Hauptdomain domain.de via 301 Redirect auf den Ordner domain.de/catalog/de weitergeleitet.

Jetzt will der Kunde aber, dass nur die Startseite angezeigt wird.
Problem dabei, ich kann von einem Unterordner in den Hauptordner zwar eine 301 Weiterleitung machen, dann würde aber das Teil ins leere laufen, weil die Dateien nicht in der Root sondern im DE Ordner liegen.

Um Komplikationen mit dem vorhandenen CMS Shop System zu verhindern, habe ich jetzt folgende Lösung lokal erfolgreich getestet.

Ist zwar keine schöne Lösung, falls Jemand eine bessere Idee hat, immer her damit.



* Vorgehensweise:
* 1. ) Durch .htaccess DirectoryIndex auf Verzeichnis /catalog/setzen.
*
* 2. ) Datei index.php in /catalog/de/ modifzieren (Funktion siehe unten).
* Diese Funktion muss im Kopfbereich der index.php platziert werden.
*
* 3. ) Eine neue index.html im Root Verzeichnis mit dem HTML Content der
* in /catalog/de liegenden index.php abspeichern.
* (Achtung relative Pfade der Image/Css Dateien anpassen.)


PHP Datei in catalog/de


index.php

function make301($goto)
{

header("HTTP/1.1 301 Moved Permanently");
header("Location: https://$goto");
exit;
}


if ( $_SERVER['REQUEST_URI'] == ("/catalog/de/" || "/catalog/de"))
make301("$_SERVER[HTTP_HOST]");
else header("HTTP/1.1 200 OK");

Verfasst:
von

Verfasst: 01.10.2010, 11:51
von Synonym
Hm, muss man das jetzt eigentlich verstehen?

Ihr habt derzeit als "Startseite" domain.de/catalog/de.
domain.de wird da hin geleitet domain.de/catalog/de

Nun wollt Ihr als angezeigte URL domain.de aber dennoch den Inhalt von domain.de/catalog/de aufrufen.

Soweit ok. Wenn Du wie Du schreibst das R=301 weg lässt, dann hast Du genau das Ergebnis, aber eben keine Weiterleitung mehr, sondern DC und eben keinen benötigten 301 (was Du ja willst).

Wenn Du einen 301 willst, dann ist das auch einer und die URL ändert sich entsprechend. Alles andere wäre ja unlogisch.
1. ) Durch .htaccess DirectoryIndex auf Verzeichnis /catalog/setzen.
Geht nicht. DirectoryIndex gibt an, wie die Index heißt, die der Apache in jedem Ordner suchen soll. Da der in allen Ordnern sucht, macht die Angabe eines Ordners keinen Sinn.

Ansonsten, schreib doch bitte mal was Du genau aktuell hast und was Du willst. Hab mir das nun schon 3 mal durchgelesen und entweder machst Du Dir da selbst Probleme, oder ich verstehe es nicht.

Was ich durchaus bis jetzt verstanden habe:

Verzeichnisse:
/ hier liegt die htaccess
/catalog/de/ hier liegen die Shopdateien

URL:
/ wird aktuell weitergeleitet auf /catalog/de/
/catalog/de/ soll nun weitergeleitet werden auf /
/catalog/de/irgend-ein-artikel/ soll bestehen bleiben

Wobei.... Wo ist denn nun das Problem??

Nimm die aktuelle Weiterleitung raus, dann hast Du als Startseite wieder /
Mach eine neue Weiterleitung von "/catalog/de/" nach "/", dann gehen die alten Links nicht verloren
Und rufe beim Aufruf von "/" eben das Verzeichnis "/catalog/de/" intern auf

Verfasst: 03.10.2010, 23:40
von WoY
Synonym hat geschrieben:Nimm die aktuelle Weiterleitung raus, dann hast Du als Startseite wieder /
Mach eine neue Weiterleitung von "/catalog/de/" nach "/", dann gehen die alten Links nicht verloren
Und rufe beim Aufruf von "/" eben das Verzeichnis "/catalog/de/" intern auf
Danke für deine ausführliche Erklärung.

Mein Problem ist folgendes.

Wenn ich eine .htaccess in das Verzeichnis /catalog/de lege mit R=301, werden doch alle Anfragen auf dieses Verzeichnis auch mit Parametern, direkt an die index.php im Verzeichnis / weitergeleitet, entsteht dann nicht eine Endlosschleife`?

Weil ich sage Apache intern:

1. Bei Anfrage auf /catalog/de leite via 301 weiter
2. Index.php aufruf leitet intern wieder auf /catalog/de weiter.

Dann fängt doch die Regel für /catalog/de wieder an den Inhalt via 301 weiterzuleiten, oder sehe ich das etwas zu kompliziert, hättest du mir ein einfaches Beispiel, wie ich das testen kann?

Grüße guten Wochenstart und danke

Verfasst: 04.10.2010, 03:10
von 800XE
WoY hat geschrieben:entsteht dann nicht eine Endlosschleife`?
WoY hat geschrieben:1. Bei Anfrage auf /catalog/de leite via 301 weiter
2. Index.php aufruf leitet intern wieder auf /catalog/de weiter.
ist bei "2" ein 301? Nein, darum keine Endlosschleife
WoY hat geschrieben:Dann fängt doch die Regel für /catalog/de wieder an den Inhalt via 301 weiterzuleiten, oder sehe ich das etwas zu kompliziert, hättest du mir ein einfaches Beispiel, wie ich das testen kann?
Büroflur ....
... Zimmer xy5 von Mayer "Bitte an Müller wenden"
... Zimmer xy6 von Müller

Du hast was beim Mayer zu erledigen .... wegen dem "301"er Schild gehst Du ins Zimmer daneben zum Müller ...
... Müller geht durch Verbindungstür in das Mayerzimmer, macht was zu machen ist
... Müller kommt durch Verbindungstür zurück und meldet "200 OK"





nochmal Technisch

Code: Alles auswählen

ErrorDocument 404 http://www.800xe.de/index.php?error=404

Code: Alles auswählen

RewriteEngine ON
RewriteCond %{HTTP_HOST}                 ^800xe.de$ [NC]
RewriteRule ^(.*)              http://www.800xe.de/$1 [L,R=301]
Das hier sind "URLverändernte" Weiterleitungen
(wobei das ErrorDoc glaub ein 302 ist)

Code: Alles auswählen

RewriteEngine ON
RewriteRule (.*)/$             /?folder=$1
RewriteRule (.*)\.img$         /?file=$1
RewriteRule (.*)\.html$        /?file=$1
RewriteRule (.*)\.php8$        /?php8=$1
RewriteRule (.*)\.php9$        /?php9=$1
RewriteRule (.*)\.xml$         /?rss=$1

Code: Alles auswählen

ErrorDocument 404 /index.php?error=404
Hier wird die URL nicht verändert (die sichtbare)
Hier wird die URL für die interne verarbeitung verändert


Version 1= Weiterleitung = Neuaufruf mit veränderter URL
Version 2= Einfach nur ein Aufruf .... da kein "Neuaufruf" erfolgt, wird auch die htaccess nicht 2mal verarbeitet

Verfasst: 04.10.2010, 08:50
von WoY
HI 800XE,
ich liebe dein Schreibstil, auch für Vollpfosten wie mich ist es nun ersichtlich.
Vielen Dank und angenehmen Morgen.

Verfasst: 04.10.2010, 09:36
von Synonym
Wenn ich eine .htaccess in das Verzeichnis /catalog/de lege mit R=301, werden doch alle Anfragen auf dieses Verzeichnis auch mit Parametern, direkt an die index.php im Verzeichnis / weitergeleitet, entsteht dann nicht eine Endlosschleife`?
Nur mal so als kleine Anmerkung, da 800XE den Rest ja schon sagte...

Deine Frage besteht aus zwei Teilen, bei denen bei beiden ein Denkfehler ist.
werden doch alle Anfragen auf dieses Verzeichnis / weitergeleitet
Wenn Du dem sagst, dass der nur "/catalog/de" weiterleiten soll, dann ist der Rest vollkommen egal. Mit dem passiert dann gar nichts.

daher hatte ich ja geschrieben
/catalog/de/ soll nun weitergeleitet werden auf /
/catalog/de/irgend-ein-artikel/ soll bestehen bleiben
direkt an die index.php im Verzeichnis / weitergeleitet, entsteht dann nicht eine Endlosschleife
Nein, kann es nicht. Da im Root nicht weitergeleitet wird auf die "/catalog/de/index.php", sondern diese nur aufgerufen wird.

URL "domain.de/catalog/de" leitet weiter aufs Root "/". Dort wird intern die Datei "verzeichnisstruktur/catalog/de/index.php" aufgerufen.

Verfasst: 04.10.2010, 10:55
von WoY
Hi, vielen dank euch beiden, verstehe die materie langsam wirklich besser:

Folgenden Code habe ich nun:


#Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain.de$ [NC]
RewriteRule ^ index.html [L]
RewriteCond %{REQUEST_URI} ^/catalog/de/$ [NC]
RewriteRule ^ catalog/de/index.php [L]
RewriteRule ^ index2.html [L]

Problem ist jetzt, das bei Anfrage auf /catalog/de/index.php
index.html geladen wird und nicht index2.html

Wieso, von der Regel ist es doch richtig, oder liegt da noch ein Fehler?

Verfasst: 04.10.2010, 11:49
von Synonym
Hm, ok.... Irgendwie verstehe ich die Rules jetzt nicht so ganz.

RewriteCond %{HTTP_HOST} ^domain.de$ [NC]
RewriteRule ^ index.html [L]

Soll was machen? Das bedeutet nun, dass alles was als Host "domain.de" hat und einen leeren Pfad automatisch intern die index.html aufruft.

RewriteCond %{REQUEST_URI} ^/catalog/de/$ [NC]
RewriteRule ^ catalog/de/index.php [L]

Sagt aus, dass wenn in der URL exakt "/catalog/de/" vorkommt, dann intern "catalog/de/index.php" aufgerufen wird, aber auch nur, wenn es gleichzeitig ein Zugriff auf Root ist. Das tritt nie ein. Wenn die Cond "/catalog/de/" ist, dann kann die Rule nicht leer sein (^)


RewriteRule ^ index2.html [L]
Sagt aus, dass beim Zugriff auf "root" intern die index2.html aufgerufen wird.

Der Fehler ist vermutlich....

Nach einer oder mehreren Cond, wird immer nur die erste Rule dem zugeordnet.

Dein "RewriteRule ^ index2.html [L]" steht also alleine für sich.

Da Du aber schon in der ersten Rule alles mit Host "domain.de" und Zugriff auf Root auf index.html umbiegst, kommt die dritte Rule erst gar nicht zu Bearbeitung. Denn die soll ja alles was auf Root geht auf index2.html umbiegen.

Sprich, 1 und 3 sind identisch, nur dass es einmal die index1 und einmal die index2 als Zielseite ist.


Du musst die Zugriffe auf "/catalog/de/" weiterleiten an Root, also etwa so
RewriteRule ^/catalog/de/$ / [R=301,L]

Wenn das Root aufgerufen wird, dann intern auf die /catalog/de/index.php zugreifen, etwa so
RewriteRule ^$ /catalog/de/index.php [L]

alles ungetestet

Das mit Deinen index.html und index2.html verstehe ich nicht wirklich.

Verfasst: 05.10.2010, 16:32
von WoY
Hey
erstmal vielen, vielen herzlichen Dank das du dir Zeit nimmst, hast Bier gut.

Muss wohl mal in das Thema "richtig" einlesen, um nicht solche Stolpersteine zu haben, ist einfach frustrierend.



Also versuche es nochmal zu erklären, vielleicht hat Jemand eine Lösung:


1. Wird domain.de aufgerufen, wird intern die index.php im Ordner catalog/de geladen.


2. Gibt der Besucher/Suchmaschine domain.de/catalog/de ein, soll auf die Startseite via 301 umgeleitet werden.
Es ist zu beachten, das es natürlich auch Parameter /catalog/de/index.php=923923 gibt, deshalb soll diese Regel
nur auf das Muster index.php ohne Parameter anspringen.



Habe folgenden Code:

Diese Umleitung 1. klappt wunderbar.

Code: Alles auswählen

RewriteEngine On
RewriteCond %{HTTP_HOST} ^kaiserstuhlshop.de$ [NC]
RewriteRule ^$ /catalog/de/index.php [L]

Diese Umleitung 2 leider nicht, wieso keine Ahnung

Mein Verständnis mal in Worten:

Wenn Url Anfrage Anfrage auf /catalog/de/index.php enthält, leite Anfrage
mit Status Code 301 von catalog/de nach /.

Wo liegt der Fehler, werde langsam GAAAGggaa. :(

Code: Alles auswählen

RewriteCond %{REQUEST_URI} ^/catalog/de/$ [NC]
RewriteRule ^/catalog/de/$ / [R=301,L]

Verfasst: 05.10.2010, 23:11
von chris21
WoY, immer mit der Ruhe, auch ein Bobbele wird das schaffen ;)

Um mal kurz zusammenzufassen, wie ich es verstanden habe:

Bisher wurde domain.de auf domain.de/catalog/de/ umgeleitet.

Nun soll bei Aufruf von domain.de nur noch der Inhalt von catalog/de/ angezeigt werden, aber zugleich nur domain.de in der Adresszeile stehen.

Ok.

Da aber bisher per 301 umgeleitet war, müsste nun die Anfrage auf domain.de/catalog/de/ umgeleitet werden auf domain.de, wobei intern wiederum der Inhalt von catalog/de/ angezeigt wird.

Ok, dann musst Du vom Konzept her folgendermaßen vorgehen:

Code: Alles auswählen

RewriteCond %{THE_REQUEST} .... catalog/de/$
RewriteRule .... http://www.example.com [R=301,L]
RewriteCond {REQUEST_URI} ^/$
RewriteRule ^ /catalog/de/ [L]

Verfasst: 06.10.2010, 10:09
von Synonym
Ja, Chris hat es nun etwas anders umgesetzt, ist aber genau das gleiche was ich zuvor sagte.

Dass die hier nicht geht kann wieder ein einfacher Zeichenfehler sein

Code: Alles auswählen

RewriteCond %{REQUEST_URI} ^/catalog/de/$ [NC]
RewriteRule ^/catalog/de/$ / [R=301,L]
In der Rule hat vorne vor "catalog" das / nichts zu suchen, wenn es in einer .htaccess benutzt wird. Also einfach beginnen mit ^catalog. Das Zeichen für den Ordner wird da nicht mit übergeben, kann also auch nicht gefunden werden. Somit trifft die Rule nie zu und hat daher auch keinen Nutzen. Hatte das bei mir auch drinnen, war ein Fehler beim Kopieren, daher auch der Zusatz "ungetestet"

Deine möglichen URls heißen also:
/
/catalog/de/
/catalog/de/index.php (Sonderfall)
/catalog/de/index.php?id=923923

Aktuell war die Startseite "/catalog/de/", das Root wurde da hin geleitet.

Wie gesagt...

1. Vorhande Weiterleitung entfernen

2. Bei Zugriff auf Root, die index "/catalog/de/index.php" abrufen

Code: Alles auswählen

RewriteRule ^$ /catalog/de/index.php [L] 
Bei Zugriff auf "Beginnt und Endet mit nichts" (Root), die "/catalog/de/index.php" intern aufrufen.

3. Die alte Startseite "/catalog/de/" weiterleiten an "/"

Code: Alles auswählen

RewriteRule ^catalog/de/$ / [R=301,L]
Bei Zugriff auf "/catalog/de/" weiterleiten an "/". Dort greift dann wieder die erste Rule und ruft intern die "/catalog/de/index.php" auf

Da das ganze bisher nur greift, wenn es exakt "/catalog/de/" ist, sind die ganzen Parameter (Unterseiten) normalerweise nicht betroffen, denn bei denen kommt ja noch index.php danach vor.

Soll nun auch die "/catalog/de/index.php" weitergeleitet werden an "/", also so wie die "/catalog/de/" auch ist es ein Sonderfall, da die Index.php ja auch benutzt wird um die ganzen Parameter zu übergeben. Daher dort dann nur umleiten, wenn kein Parameter vorhanden ist. Zudem Ruft der Apache die index.php ja ohnehin von selbst auf, wenn auf ein Verzeichnis zugegriffen wird, daher muss man das unterscheiden. Wäre dem nicht so, dann würde auch der interne Zugriff weitergeleitet werden, also eine Endlosschleife entstehen.

Code: Alles auswählen

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /catalog/de/index\.php
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^catalog/de/index.php$ / [R=301,L]
Wenn es also nicht schon interner Request ist, gleichzeitig der Query-String leer ist und gleichzeitig auf die "catalog/de/index.php" zugegriffen wird, dann weiterleiten an "/". Die Ruft dann wieder intern die eigentliche "catalog/de/index.php" auf. Daher im Code die Prüfung auf den Subrequest.

Testseite:
Aufruf: https://1nt.de
Abruf intern: /catalog/de/index.php
URL: https://1nt.de
Status: 200

Aufruf: https://1nt.de/catalog/de/
Weiterleitung: /
Abruf intern: /catalog/de/index.php
URL: https://1nt.de
Status: 301

Aufruf: https://1nt.de/catalog/de/index.php?id=123
Abruf intern: /catalog/de/index.php / Parameterübergabe
URL: https://1nt.de/catalog/de/index.php?id=123
Status: 200

Aufruf: https://1nt.de/catalog/de/index.php
Weiterleitung: /
Abruf intern: /catalog/de/index.php
URL: https://1nt.de
Status: 301

Also bei mir funktioniert das so. Kannst Du ja selbst testen.

Meine .htaccess dazu sieht komplett zu aus:

Code: Alles auswählen

RewriteEngine ON

# Startseite intern umbiegen
RewriteRule ^$ /catalog/de/index.php [L]

# Alte Startseite weiterleiten
RewriteRule ^catalog/de/$ / [R=301,L]

# Alte Startseite index.php weiterleiten
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /catalog/de/index\.php
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^catalog/de/index.php$ / [R=301,L]

Verfasst: 18.10.2010, 10:00
von WoY
So, möchte mich bei euch mal ganz herzlich bedanken. das klappt super und langsam verstehe ich es etwas :wink: .

gibt es einen debugger für mode rewrite?

Verfasst: 18.10.2010, 11:09
von Synonym
gibt es einen debugger für mode rewrite?
Meinst Du für die Syntax selbst? Nicht, dass ich wüsste. Der Apache schreibt Dir ja auch Meldungen ins error-Log, wenn was nicht stimmt.

Oder meinst Du zur Kontrolle was die Rules denn überhaupt so tun, bzw. ob sie überhaupt was tun?
Wenn, dann schalte das RewriteLog ein. Je nach LogLevel zeigt es Dir dann genau was durch die einzelnen Rules passiert. Warum, in welcher Reihenfolge, was daraus wird usw....
https://httpsd.apache.org/docs/2.0/mod/ ... rewritelog
https://httpsd.apache.org/docs/2.0/mod/ ... teloglevel

Aber Achtung, das RewriteLog sollte nur kurzfristig verwendet werden, vor allem bei hohem LogLevel. Das zieht Dir sonst Deinen Server ganz schön runter und schreibt Unmengen an Zeilen ins Log ;-)

Zitat:
Using a high value for Level will slow down your Apache server dramatically! Use the rewriting logfile at a Level greater than 2 only for debugging!