Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

htaccess redirect upper- to lowercase-URL´s

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Neues Thema Antworten
euroexchange.de
PostRank 6
PostRank 6
Beiträge: 471
Registriert: 02.06.2007, 13:49

Beitrag von euroexchange.de » 10.09.2009, 13:49

Hallo.

Laut Webmastertools habe ich doppelten Content durch unterschiedliche URL´s, bedingt durch einmal Klein- und einmal Großschreibung innerhalb der URL´s.

Beispiel:
Im schlimmsten Fall auch noch:
Das leichteste wäre natürlich ein Eintrag in "httpd.conf" mit:
RewriteMap lowercase int:tolower
RewriteCond $1 [A-Z]
RewriteRule ^/(.*)$ https://www.example.de/${lowercase:$1} [R=301,L]
Da ich bei meinem Server aber darauf keinen Zugriff habe muß ich mit einem Workaround arbeiten. Dieser sieht wie folgt aus:
# Skip this entire section if no uppercase letters in requested URL
RewriteRule ![A-Z] - [S=28]
# Else rewrite one of each uppercase letter to lowercase
RewriteRule (*[A]*)A(.*)$ /$1a$2
RewriteRule ^([^B]*)B(.*)$ /$1b$2
RewriteRule ^([^C]*)C(.*)$ /$1c$2
RewriteRule ^([^D]*)D(.*)$ /$1d$2
RewriteRule ^([^E]*)E(.*)$ /$1e$2
RewriteRule ^([^F]*)F(.*)$ /$1f$2
RewriteRule ^([^G]*)G(.*)$ /$1g$2
RewriteRule ^([^H]*)H(.*)$ /$1h$2
RewriteRule ^([^I]*)I(.*)$ /$1i$2
RewriteRule ^([^J]*)J(.*)$ /$1j$2
RewriteRule ^([^K]*)K(.*)$ /$1k$2
RewriteRule ^([^L]*)L(.*)$ /$1l$2
RewriteRule ^([^M]*)M(.*)$ /$1m$2
RewriteRule ^([^N]*)N(.*)$ /$1n$2
RewriteRule ^([^O]*)O(.*)$ /$1o$2
RewriteRule ^([^P]*)P(.*)$ /$1p$2
RewriteRule ^([^Q]*)Q(.*)$ /$1q$2
RewriteRule ^([^R]*)R(.*)$ /$1r$2
RewriteRule ^([^S]*)S(.*)$ /$1s$2
RewriteRule ^([^T]*)T(.*)$ /$1t$2
RewriteRule ^([^U]*)U(.*)$ /$1u$2
RewriteRule ^([^V]*)V(.*)$ /$1v$2
RewriteRule ^([^W]*)W(.*)$ /$1w$2
RewriteRule ^([^X]*)X(.*)$ /$1x$2
RewriteRule ^([^Y]*)Y(.*)$ /$1y$2
RewriteRule ^([^Z]*)Z(.*)$ /$1z$2

# If more uppercase letters remain, re-invoke .htaccess and start over
RewriteRule [A-Z] - [N]
# Else do a 301 redirect to the all-lowercase URL
RewriteRule (.*) $1 [R=301,L]
Zur Problembeschreibung.
Mit dem obigen Code wird aus z.B.:
Man beachte das "Search.php". Der Code verändert also nur die Großschreibung vor dem "?" in Kleinschreibung.

Hat jemand von Euch eine Idee wie ich die RewriteRules auf die gesamte URL anwende? Danke!

Anzeige von ABAKUS

von Anzeige von ABAKUS »


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

mgutt
PostRank 10
PostRank 10
Beiträge: 3206
Registriert: 08.03.2005, 13:13

Beitrag von mgutt » 10.09.2009, 16:02

In dem Du den Rewrite im PHP-Script realisierst.

D.h. Du liest searchword aus und prüfst, ob vorher und nachher ein unterschiedliches Ergebnis existieren:

Code: Alles auswählen

if ($_GET['searchword'] != preg_replace('#[^a-z0-9- ]#', '', $_GET['searchword']) {
In dem Fall werden alle Zeichen außer kleine Buchstaben, Zahlen, der Bindestrich und das Leerzeichen ersetzt. Wenn also große Buchstaben drin sind, wird die Bedingung fehlschlagen und Du kannst den Besucher umleiten.

Du solltest Dein Script natürlich entsprechend anpassen. Falls aber noch andere Zeichen erlaubt sind z.B. Umlaute oder Sonderzeichen, müsste man das anders lösen.

Auch sollten diese Links gar nicht erst auf Deiner Seite auftauchen. Da solltest Du schon eingreifen mit strtolower().

Gruß
Ich kaufe Dein Forum!
Kontaktdaten

euroexchange.de
PostRank 6
PostRank 6
Beiträge: 471
Registriert: 02.06.2007, 13:49

Beitrag von euroexchange.de » 10.09.2009, 16:11

@mgutt

Danke für Deine Hilfe.

strtolower habe schon gemacht und es existieren auch keine URL´s in Großschreibung mehr auf meinen Seiten.

Problem sind die von außen kommenden URL´s. Die muß ich umschreiben und mit 301er umleiten.

Nachtrag:
Tschuldigung. Ich hatte Dir gerade nicht ganz folgen können. Das könnte ja eine Lösung sein! Ist der Redirect so auch als 301er nutzbar?

Anzeige von ABAKUS

von Anzeige von ABAKUS »

Content Erstellung von ABAKUS Internet Marketing
Ihre Vorteile:
  • einzigartige Texte
  • suchmaschinenoptimierte Inhalte
  • eine sinnvolle Content-Strategie
  • Beratung und Umsetzung
Jetzt anfragen: 0511 / 300325-0

mgutt
PostRank 10
PostRank 10
Beiträge: 3206
Registriert: 08.03.2005, 13:13

Beitrag von mgutt » 10.09.2009, 16:25

Das ist kein Redirect, sondern nur eine Bedingung. Den Redirect baust Du halt danach selber ein ;)
Ich kaufe Dein Forum!
Kontaktdaten

euroexchange.de
PostRank 6
PostRank 6
Beiträge: 471
Registriert: 02.06.2007, 13:49

Beitrag von euroexchange.de » 10.09.2009, 20:21

Ich kriege es irgendwie nicht hin mit den URLENCODED Umlauten ...
Bei Seitenaufruf dauert es ewig und irgendwie passiert nichts.

Code: Alles auswählen

if ($_GET['searchword'] != preg_replace('#[^a-z0-9-+][%FC|%E4|%F6|%DF|%DC|%C4|%D6]#', '', $_GET['searchword'])) {
// echo $_GET['searchword'];
// echo strtolower($_SERVER['REQUEST_URI']);

$nurl = strtolower($_SERVER['REQUEST_URI']);
$nurl = str_replace("%20", "+", $nurl); - Ersetzt urlencoded Leerzeichen durch Pluszeichen
$nurl = str_replace("++", "+", $nurl);

header( "HTTP/1.1 301 Moved Permanently" );
header( "Location: $nurl" );

 }  

mgutt
PostRank 10
PostRank 10
Beiträge: 3206
Registriert: 08.03.2005, 13:13

Beitrag von mgutt » 11.09.2009, 10:14

Dann lass die Weiterleitung erstmal weg, also setz davor ein exit(), damit Du die Ergebnisse vergleichen kannst.

Und warum das Pluszeichen? Auf dem Server kommt doch ein Leerzeichen an oder nicht?
Ich kaufe Dein Forum!
Kontaktdaten

euroexchange.de
PostRank 6
PostRank 6
Beiträge: 471
Registriert: 02.06.2007, 13:49

Beitrag von euroexchange.de » 11.09.2009, 17:06

Hallo.

Nebenbemerkung: Ich kann das leider nicht anständig posten. Mit BBCode bleibt alles leer. ???

Ich benötige das + in der URL für die weitere, interne Verarbeitung.

Habe jetzt folgendes:

[code] if ($_GET['searchword'] != preg_replace('#[^a-zäöüßÄÖÜ0-9-+ ]#', '', $_GET['searchword'])) {

$ourl = $_SERVER['REQUEST_URI']; // Original-URL
$lurl = strtolower($_SERVER['REQUEST_URI']); // Lower-URL
$nurl = str_replace(" ", "+", $lurl);
$nurl = str_replace("%20", "+", $nurl);
$nurl = str_replace("++", "+", $nurl);

header( "HTTP/1.1 301 Moved Permanently" );
header( "Location: $nurl" );
} [/code]

Problem ist noch, das er Leerzeichen in der URL nicht als Bedingung für den Rewrite annimmt.

[url]https://www.euroexchange.de/search.php? ... %20italien[/url]

oder

[url]https://www.euroexchange.de/search.php? ... ferienhaus italien[/url]

Er ersetzt die Leerzeichen nur, wenn z.B. die Bedingung "ein Großbuchstabe in URL" gefunden wird.

[url]https://www.euroexchange.de/search.php? ... Ferienhaus italien[/url]

Und außerdem beißt sich das Ganze mit der "example.de" zu "www.example.de" Umleitung in der htaccess. Dann geht garnix mehr.

[url]https://euroexchange.de/search.php?do_s ... Ferienhaus italien[/url]

Htaccess:
[code] RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteCond %{HTTP_HOST} !^$ [NC]
RewriteRule ^(.*) https://www.%{HTTP_HOST}/$1 [R=301,L]

ErrorDocument 404 https://www.example.de/ [/code]

Werde die URL wohl zerlegen müßen und HTTP_HOST innerhalb der Rule nochmal abfragen, sonst läuft er in eine Schleife weil er immer wieder auf URL ohne www. umleitet.

Mhhhh ...

800XE
PostRank 10
PostRank 10
Beiträge: 5223
Registriert: 02.12.2004, 03:03

Beitrag von 800XE » 11.09.2009, 17:38

euroexchange.de hat geschrieben:$ourl = $_SERVER['REQUEST_URI']; // Original-URL
$lurl = strtolower($_SERVER['REQUEST_URI']); // Lower-URL
$nurl = str_replace(" ", "+", $lurl);
$nurl = str_replace("%20", "+", $nurl);
$nurl = str_replace("++", "+", $nurl);

header( "HTTP/1.1 301 Moved Permanently" );
header( "Location: $nurl" );
}



Werde die URL wohl zerlegen müßen und HTTP_HOST innerhalb der Rule nochmal abfragen, sonst läuft er in eine Schleife weil er immer wieder auf URL ohne www. umleitet.

Mhhhh ...
Wo ist in der URL für den Location der Host?
Der ist doch dort nicht drin?

https://mit-oder-ohne-www.de/domain-wei ... irect.html

Code: Alles auswählen

function make301($goto)
{
  header("HTTP/1.1 301 Moved Permanently"); 
  header("Location: http://$goto"); // Umleitung des Browsers
  exit;
}

Code: Alles auswählen

$DCkill_  =$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];  

$DCkill   = strtolower( $DCkill_  );
$DCkill   = str_replace(  '%20' , '+' , $DCkill  );
$DCkill   = str_replace(  ' ' , '+' , $DCkill  );

//Umlaute überlasse ich mal dir

if ( strcmp($DCkill,$DCkill_) )
{
  make301($DCkill);
}

euroexchange.de
PostRank 6
PostRank 6
Beiträge: 471
Registriert: 02.06.2007, 13:49

Beitrag von euroexchange.de » 11.09.2009, 18:25

Danke 800XE :-)

Ja stimmt. Der Host war noch garnicht enthalten. Danke!

Ich blicke im Moment garnicht mehr durch und habe die Umschreibung jetzt deaktiviert. Es gibt soviele Unwägsamkeiten und ich bin mir unsicher ob ich mich damit nicht aus dem Index schieße.

Habe gerade festgestellt das viele in Google indizierte URL´s nicht mehr aufrufbar waren weil Sie Umlaute enthielten oder sonstwas. Und auch bei Suchbegriffen wie á oder d´ geht nichts mehr.

Verdammte Computer. Ich wollte doch nur Groß- zu Kleinschreibung und Leerzeichen zu Pluszeichen ändern ...

Danke bis hierher.

euroexchange.de
PostRank 6
PostRank 6
Beiträge: 471
Registriert: 02.06.2007, 13:49

Beitrag von euroexchange.de » 13.09.2009, 13:27

Habe es jetzt so gemacht:

Code: Alles auswählen

if ($_GET['searchword'] != preg_replace('#[A-Z]#', '', $_GET['searchword'])) {

$nurl = strtolower($_SERVER['REQUEST_URI']); // Lower-URL
$nurl = str_replace(" ", "+", $nurl);
$nurl = str_replace("%20", "+", $nurl);
$nurl = str_replace("++", "+", $nurl);

header( "HTTP/1.1 301 Moved Permanently" );
header( "Location: $nurl" );

 }
Das schreibt die URL immer um wenn ein Großbuchstabe enthalten ist. Leider ersetzt das Umlaute und Leerzeichen so auch nur wenn ein Großbuchstabe in der URL vorkommt. Aber besser ist es schonmal ...

Mork vom Ork
PostRank 9
PostRank 9
Beiträge: 2557
Registriert: 08.07.2008, 11:07
Wohnort: Aufm Friedhof.

Beitrag von Mork vom Ork » 13.09.2009, 14:23

euroexchange.de hat geschrieben:

Code: Alles auswählen

if ($_GET['searchword'] != preg_replace('#[A-Z]#', '', $_GET['searchword'])) {

    $nurl = strtolower($_SERVER['REQUEST_URI']); // Lower-URL
    $nurl = str_replace(" ", "+", $nurl);
    $nurl = str_replace("%20", "+", $nurl);
    $nurl = str_replace("++", "+", $nurl);
Das schreibt die URL immer um wenn ein Großbuchstabe enthalten ist. Leider ersetzt das Umlaute und Leerzeichen so auch nur wenn ein Großbuchstabe in der URL vorkommt.
Dann musst du die Klammern des if-Blocks nicht so weit setzen. Ich sehe in Bezug auf Umlaute und Leerzeichen aber eh nicht so ganz den Sinn, denn der Parameter wird von PHP für $_GET['searchword'] von alleine dekodiert. %20 und + müssten von PHP gleich behandelt werden und Leerzeichen als solche dürften in einer URL sowieso nicht vorkommen. Du musst also garnichts ersetzen.

Ich täte es in etwa so probieren:

Code: Alles auswählen

if (($suche = strtolower($_GET['searchword'])) != $_GET['searchword']) {
    // Weiterleitung
    $_GET["searchword"] = $suche;
    $g = Array();
    foreach ($_GET as $n => $d) {
        $g[] = $n . "=" . rawurlencode($d);
    }
    header("HTTP/1.0 301");
    header("Location: http://www.euroexchange.de/search.php?" . join("&", $g));
}
else {
    // Suche mit $suche
}
mod_rewrite hast du hoffentlich gänzlich entfernt, denn es spricht nichts dagegen, dass du das komplett in search.php erledigst.

mgutt
PostRank 10
PostRank 10
Beiträge: 3206
Registriert: 08.03.2005, 13:13

Beitrag von mgutt » 13.09.2009, 16:18

aso: nach dem letzten header() sollte immer noch ein exit() folgen, damit das script in jedem fall an der stelle abbricht (falls gewollt).

zu deinem umlautproblem, müsste ich jetzt erstmal wissen, was du überhaupt erreichen willst. möchtest du aus Ü ein ü machen oder was genau macht dir noch probleme?

grundsätzlich solltest du keine uncodierten umlaute in der url haben. hast du sie doch drin, dann ist der fehler bereits bei der ausgabe des link zu suchen (oder du denkst es wäre ein umlaut drin, weil du firefox benutzt).

@ mork
ich habe das so verstanden, dass er auch umlaute haben will und rawlurlencode wirft in dem fall große zeichen zurück. resultat wäre meiner ansicht nach eine unendlichschleife.

die sache mit foreach und dem join() erscheint mir auch unnötig zu sein. http_build_query() macht beides in einem. dann kannst du auch gleich auf ein extra array verzichten und mit $_GET arbeiten.
Ich kaufe Dein Forum!
Kontaktdaten

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag