2016-06-19 5 views
0

Website hat seine URL-Namen aus SEO-Gründen, z. es war:mod_rewrite 301 Umleitung von alten URLs zu neuen

/category/filter1/f00/filter2/123/filter3/100-500/filter4/36.html 

jetzt:

/category/color/red/size/big/price/100-500/style/classic.html 

Ich kenne die alten und neuen Namen, sind sie fixiert. Bitte helfen Sie mir, eine Rewrite-Regel zu erstellen, die dazu führt, dass 301 von alten URLs zu neuen umgeleitet wird. Ich habe recherchiert, und ich sehe, dass ich es nicht mit RewriteMap zum Beispiel schaffen kann, also habe ich so etwas wie RewriteRule (.*)filter1(.*) $1color$2 [L] usw. gemacht. Nicht nur mag ich nicht, wie es aussieht, aber es gibt mir auch keine 301-Weiterleitung.

UPDATE: Beachten Sie, dass ich habe mehrere Regeln in dem Moment, eine pro Filter Name/Wert, zB:

RewriteEngine on 

# make sure it's a catalog URL, not anything else 
RewriteCond %{REQUEST_URI} !^/(category1|category2|category3|category4) 
RewriteRule .* - [L] 

# rewrite filter names 
RewriteRule (.*)filter1(.*) $1color$2 [L] 
RewriteRule (.*)filter2(.*) $1price$2 [L] 
...etc... 

Es funktioniert wie erwartet - Ändern alle Namen in URL, aber Einstellung R Flagge bewirkt, dass der Anschlag auf erster Regel und Umleitung URL wie:

/var/www/vhosts/site/htdocs/category/color/red/filter2/123/ etc... 

I Regeln getrennt, weil jede von Filtern in der URL oder nicht vorhanden sein kann. Ich werde die bessere Lösung sehr schätzen.

Antwort

1

Hier ist meine eigene Antwort: Es ist möglich, mit Umgebungsvariablen zu tun. Wir müssen alte Filternamen und -werte durch neue ersetzen und dann nur eine 301-Umleitung auf die neue URL vornehmen. Hier ist, was ich habe mit mod_rewrite und Umgebungsvariablen durchgeführt:

RewriteEngine on 

RewriteRule /filter1/    - [E=filters:/color/] 
RewriteRule /f00[.\/]    - [E=filters:%{ENV:filters}red] 
RewriteRule /0f0[.\/]    - [E=filters:%{ENV:filters}green] 
RewriteRule /00f[.\/]    - [E=filters:%{ENV:filters}blue] 

RewriteRule /filter2/    - [E=filters:%{ENV:filters}/size/] 
RewriteRule /123[.\/]    - [E=filters:%{ENV:filters}big] 
RewriteRule /32[.\/]    - [E=filters:%{ENV:filters}small] 

RewriteRule /filter3/([^/^\.]+)  - [E=filters:/price/$1] 

RewriteRule /filter4/    - [E=filters:%{ENV:filters}/style/] 
RewriteRule /36[.\/]    - [E=filters:%{ENV:filters}classic] 
RewriteRule /37[.\/]    - [E=filters:%{ENV:filters}urban] 

RewriteCond %{REQUEST_URI} ^/(category1|category2|category3|category4)/ 
RewriteCond %{ENV:filters} !^$ 
RewriteRule ^([^/]+)/ /$1%{ENV:filters}.html [L,R=301] 

Im Grunde habe ich die URL in Umgebung umformatiert ganze Variable filters dann überprüft, ob es sich um eine Kategorie ist und nicht irgendein anderes Teil der Website, und schließlich gemacht Umleitung auf diese Kategorie + Filter-Variable, angehängt .html am Ende.

+0

Cool, sehr konstruktive Vorgehensweise! –

0

Auch wenn die neue URL zu einem menschlichen hübschere sieht, ich bin nicht sicher, ob ein Bedarf gibt es die vorhandene URL für SEO Gründen zu ändern.


Um eine Umleitung statt einer Rewrite zu erhalten, können Sie die R|redirect Flag verwenden. So würde die Regel aussehen

RewriteRule (.*)filter1(.*) $1color$2 [R,L] 

Aber wenn Sie mehrere Umleitungen haben, könnte dies sich negativ auf Ihre SEO Ergebnisse auswirken, siehe Chained 301 redirects should be avoided for SEO , but Google will follow 2 or 3 stacked redirects

  • Denken Sie daran, dass im Idealfall sollten Sie keine gestapelt Umleitungen oder sogar eine einzige Weiterleitung, wenn Sie es helfen können, aber wenn erforderlich Google folgt Kettenverkettungen
  • Aber jede zusätzliche Weiterleitung wird es wahrscheinlicher machen, dass Google den Weiterleitungen nicht folgen und PageRank
  • übergeben wird auf einmal
  • Für Google halten es zwei und maximal drei Umleitungen, wenn Sie
  • Bing haben

gar nicht gekettet Umleitungen unterstützen kann

RewriteRule ^(.*)/filter1/(.*)/filter2/(.*)$ $1/color/$2/size/$3 [R,L] 
Dies bedeutet, versuchen, mehrere Filter ersetzen

und so weiter.


Wenn die Filter in einer beliebigen Reihenfolge kommen können, können Sie verschiedene Regeln verwenden und am Ende

RewriteRule ^(.*)filter1(.*)$ $1color$2 [L] 
RewriteRule ^(.*)filter2(.*)$ $1price$2 [L] 
RewriteRule ^(.*)filter3(.*)$ $1size$2 [L] 

RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule^%{REQUEST_URI} [R,L] 

RewriteCond mit REDIRECT_STATUS es eine Umleitung zu tun ist, um eine Endlosschleife zu verhindern.


Wenn es funktioniert, wie es sollte, können Sie R mit R=301 ersetzen. Niemals mit R=301 testen.

Eine letzte Anmerkung, sei sehr vorsichtig mit diesen Experimenten. Ich schaffte es, meine Maschine zweimal zu töten (sie reagierte nicht mehr und ich musste abschalten) während der Tests.

+0

Vielen Dank für die ausführliche Antwort. Aus "SEO Gründen" - einige der URLs waren in meiner Muttersprache, und es ist durch Experimente bewiesen, dass es für SEO besser ist, es in englische Buchstaben (Transliteration) zu übersetzen. Was die Ketten angeht - warum sollte es zu einer Redirect-Kette führen? Es gab eine alte URL und eine neue URL, und ich habe eine 301-Weiterleitung zwischen ihnen festgelegt. Die neue Seite sollte keine alten URLs enthalten, sodass Google keine andere Weiterleitung durchführen muss. Korrigiere mich bitte. In Bezug auf "R" -Flag - Ich habe versucht, es zu setzen, aber ich habe mehrere Regeln (siehe Post-Updates) und es stoppt nach der ersten Regel. – Martin

+0

Wenn Sie für jeden Filter separate Regeln haben, z. Filter1 R -> Filter2 R -> Filter3 R -> Filter4 R, Sie haben 4 Weiterleitungen. Dies würde das Laden der Seite verlangsamen (schlecht für die Benutzererfahrung), weil Sie 4 Rundreisen haben, und auch eine Redirect-Kette, die * Ihren Seitenrang beeinflussen kann. Disclaimer, ich bin kein SEO-Experte. –

+0

Kein Zweifel, ich brauche nicht mehr als eine Weiterleitung. Kann dies nur durch einen erfolgen? Oder ist es unmöglich mit mod_rewrite? – Martin