301 Weiterleitungen für Post-, Seiten-, Kategorie- und Bild-URLs erstellen?
3 Antworten
- Stimmen
-
- 2010-08-30
Hallo @CJN: ,
Ihreerste Frage,das Verschieben des WordPress-Verzeichnisses,wird andersbehandelt als die anderen.
Verschieben von WordPress aus dem Unterverzeichnisin das Stammverzeichnis:
Gehen Sie zu
/wp-config.php
undfügen Sie Folgendes zu den Definitionen hinzu (natürlich unter Verwendung der Domain Ihres Kunden anstelle vonexample.com
):define('WP_SITEURL', 'http://example.com'); define('WP_HOME', WP_SITEURL);
301 Weiterleitungenmit
template_loader
undwp_safe_redirect()
Sie können dengrößten Teil Ihrer Fragen lösen,indem Sie
.htaccess
ändern,wie @ Kau-Boy zeigt,wie,oder Sie könneneseinfachin PHPtun . WordPress verfügt übereinentemplate_redirect
-Hook,den Sie dazu zusammenmit derwp_safe_redirect()
-Funktion verwenden können,ummit einem301
HTTP-Statuscode umzuleiten. Wie Sie sehen können,ist der Restnurbrutalfür PHP-Code undein bisschen Magiefür reguläre Ausdrücke. Sie können diesen Codepraktisch überallin die Dateifunctions.php
Ihres Themaseinfügen:add_action('template_redirect','my_template_redirect'); function my_template_redirect() { $redirect_to = false; list($url_path,$params) = explode('?',$_SERVER['REQUEST_URI']); $path_parts = explode('/',trim($url_path,'/')); switch ($path_parts[0]) { case 'products-directory': $redirect_to = '/products-top-level-page'; break; case 'about-directory': $redirect_to = '/about-top-level-page'; break; case 'services-directory': $redirect_to = '/services-top-level-page'; break; default: if (preg_match('#same-word(.*)#',$path_parts[0],$match)) { $category = str_replace('.html','',$match[1]); $redirect_to = "/newcategory/{$category}"; } else { // Do whatever else you need here } } if ($redirect_to) { wp_safe_redirect($redirect_to,301); exit(); } }
Betrachten Sie Benutzerfreundlichkeit undnichtnur SEO?
Ich würdefragen,ob Sie wirklich # 2machen wollen? IMO,dieeine Websitefür Benutzer viel wenigernutzbarmacht alseine,die ausschließlichfür wahrgenommene SEO optimiertist (und als Gründer undeinmaliger Mitorganisator von ) Diese Gruppe Ichbin kein SEO-Neuling.) Ich würde viel lieber sehen,dass Sieeinfach den
"-directory"
aus demersten Segment der URLentfernen Pfad. JMTCW sowieso.404 Seitengenerieren?
Wenn Sieeinen 404 ausgebenmüssen,können Sie diesmit dem Headertun:
header("HTTP/1.0 404 Not Found"); exit;
Aberich denke,das wollen Sienicht,richtig? Ich denke,Sie könnenjede Umleitungslogikerreichen,die Siebenötigen,indem Sie die obige PHP-Funktion ändern und auf die HTTP-Anfragemit einem
301
antworten,oder?Importieren von Bildernin die Medienbibliothek und 301 Umleiten
Sie können siein die Medienbibliothek verschieben und auf diese Weisein Zukunft verwalten. Hieristein Plugin,das helfen könnte (obwohlichnicht sicherbin,obesmit 3.0funktioniert; wennnicht,istesmöglicherweisetrotzdemeine gute Codebasis):
Hardcodierung der Bild-URL 301 Leitetmithilfeeines Arrays um
Daes dann eine einmalige Sache wäre ,könnten Sie Ihre Bild-URLseinfach in ein Array fest codieren und sie verwenden,um siein Ihrer Umleitungsfunktion abzugleichen. Das Ändern der Standardeinstellungin der switch-Anweisunggegenüber dem obigen Code könntefolgendermaßen aussehen:
default: if (preg_match('#same-word(.*)#',$path_parts[0],$match)) { $category = str_replace('.html','',$match[1]); $redirect_to = "/newcategory/{$category}"; } else { $images = array( '/images/image1.jpg' => '/wp-content/uploads/2010/08/image1.jpg', '/images/image2.jpg' => '/wp-content/uploads/2010/08/image2.jpg', '/images/image3.jpg' => '/wp-content/uploads/2010/08/image3.jpg', ); if (in_array($url_path,$images)) { $redirect_to = $images[$url_path]; } else { // Do whatever else you need here } }
Verwenden von
preg_match()
,um 301 Bildernach URL-Muster umzuleitenWenn Ihre Bild-URLseinem Musterfolgen,können Sienatürlicheinen Großteil oder dasgesamte Bildarraymit einem
preg_match()
optimieren,wiefolgt:if (preg_match('#^/images/(.*)$#',$url_path,$match)) { $redirect_to = "/wp-content/uploads/2010/08/{$match[1]}"; }
Hoffe das hilft?
Hi @CJN:,
Your first question, moving the WordPress directory is handled differently from the rest.
Moving WordPress from Subdirectory to Root:
Go into
/wp-config.php
and add the following to defines (using your client's domain instead ofexample.com
of course):define('WP_SITEURL', 'http://example.com'); define('WP_HOME', WP_SITEURL);
301 Redirects using
template_loader
andwp_safe_redirect()
You can solve most of the rest of your questions by modifying
.htaccess
as @Kau-Boy shows how, or you can just do it in PHP. WordPress has atemplate_redirect
hook you can use for this along with thewp_safe_redirect()
function to redirect with a301
HTTP status code. As you can see the rest is just brute for PHP code and a bit of regular expression magic sprinkled in. You can put this code practically anywhere in your theme'sfunctions.php
file:add_action('template_redirect','my_template_redirect'); function my_template_redirect() { $redirect_to = false; list($url_path,$params) = explode('?',$_SERVER['REQUEST_URI']); $path_parts = explode('/',trim($url_path,'/')); switch ($path_parts[0]) { case 'products-directory': $redirect_to = '/products-top-level-page'; break; case 'about-directory': $redirect_to = '/about-top-level-page'; break; case 'services-directory': $redirect_to = '/services-top-level-page'; break; default: if (preg_match('#same-word(.*)#',$path_parts[0],$match)) { $category = str_replace('.html','',$match[1]); $redirect_to = "/newcategory/{$category}"; } else { // Do whatever else you need here } } if ($redirect_to) { wp_safe_redirect($redirect_to,301); exit(); } }
Consider Usability and Not Just SEO?
I would ask if you really want to do #2? IMO that makes a site a lot less usable for users than one that is optimized solely for perceived SEO (and as founder and one time co-organizer of this group I'm not an SEO neophyte.) I'd much rather see you just drop the
"-directory"
from the first segment of the URL path. JMTCW anyway.Generating 404 Pages?
If you need to issue a 404 you can do it with header:
header("HTTP/1.0 404 Not Found"); exit;
However I think that's not what you want to do, correct? I think you can achieve whatever redirect logic you need by modifying the PHP function above and responding to the HTTP request with a
301
, right?Importing Images into Media Library and 301 Redirecting
You could move them into the media library and doing so would allow you to manage them moving forward. Here's a plugin that might help (although I'm not sure if it is working with 3.0; if not it might be a good code base to work with anyway):
Hardcoding Image URL 301 Redirects using an Array
Then since it would be a one-time thing you could simply hardcode your image URLs into an array and use them to match in your redirection function. Modifying the default in the switch statement from the code above it might look like this:
default: if (preg_match('#same-word(.*)#',$path_parts[0],$match)) { $category = str_replace('.html','',$match[1]); $redirect_to = "/newcategory/{$category}"; } else { $images = array( '/images/image1.jpg' => '/wp-content/uploads/2010/08/image1.jpg', '/images/image2.jpg' => '/wp-content/uploads/2010/08/image2.jpg', '/images/image3.jpg' => '/wp-content/uploads/2010/08/image3.jpg', ); if (in_array($url_path,$images)) { $redirect_to = $images[$url_path]; } else { // Do whatever else you need here } }
Using
preg_match()
to 301 Redirect Images by URL PatternOf course if your image URLs follow a pattern you could streamline much or all of the images array using a
preg_match()
instead, like so:if (preg_match('#^/images/(.*)$#',$url_path,$match)) { $redirect_to = "/wp-content/uploads/2010/08/{$match[1]}"; }
Hope this helps?
-
Hallo Mike, Wieimmerbist du unglaublich - sehr hilfreich und hilfreichgründlich! Aber - das sieht sehrbeängstigend aus undichmachemir Sorgen,dassich über den Kopf komme,wennes darumgeht,mit PHP- und Core-Dateien herumzuspielen ... Imersten Teil Ihrer Antwort sagen Sie,dassichesmit .htaccessmachen kann,wie @ Kau-Boy zeigt,alsoist Ihre Antworteine Alternative dazu,richtig? Bei Punkt 2 sind die Verzeichnissenur "/products/" usw.,kein "-Verzeichnis" -esgibt einegroße Anzahlnutzloser Verzeichnissemit einergroßen Anzahlnutzloser Dateien. Ich wollteeinen schmerzlosen Weg,um sie loszuwerden"alles außer" die oberste Seitein einer kleinen Anzahl von Verzeichnissen.Hi Mike, As always, you're amazing - thoroughly helpful and helpfully thorough! But -- this looks very scary and I'm worried I'll get in over my head as far as messing with php and core files... In the first part of your answer you say I can do it with .htaccess as @Kau-Boy shows, so your answer is an alternative to that, correct? On point #2, the directories are just "/products/" etc., no "-directory" -- there are a huge # of useless directories with a huge # of useless files within, I wanted a painless way to get rid of "everything except" the top level page within a small # of directories.
-
Und zu: "Generieren von 404" - Ichmöchte vermeiden,404 zugenerieren,nicht wahr?Ich versuche allesmit 301 zu "fangen".Diese Idee war,dasseseine einfache Möglichkeit sein könnte,"alles außer" den wenigen Seiten umzuleiten,dieichin meinen anderen 301-Regelnidentifiziere - also alles außer diesen wenigen Seiten löschen;Anstatt dassein Benutzereinen 404erhält,wirder auf die vonmirfestgelegte Homepage/Zufallsseite umgeleitet.Aberist daseine kluge Art,damit umzugehen? Wie sich herausstellt,haben viele dernutzlosen Verzeichnisse aucheinen eigenen Bilderordner,alsomehr Schmerz damit ... Wie auchimmer,ich schätze Ihre Hilfe sehr (hier undin anderen Foren,in denenich Sie sehe).And, re: "Generating 404" - I want to avoid generating 404s, don't I? I'm try to 'catch' everything with 301's. That idea was that it might be an easy way to redirect "everything except" the few pages I identify in my other 301 rules-- so delete everything except those few pages; instead of user getting a 404, they get re-directed to home /random page I set? But,is that wise way to deal with it? As it turns out, a lot of the useless directories have their own images folder within also, so more pain with that... Anyway, I truly appreciate all your help (here and on other forums I see you on).
-
@CJN: Ja,diesisteine Alternative zur Verwendung von ".htaccess",dieich selbstmeinen schlimmsten Feindennicht wünsche.:) Im Ernst,PHPist so vieleinfacher,etwas Robustes zu schreiben alsmit `.htaccess`.Ihre Frageenthielt "Verzeichnis",weshalbich siein meiner Antwort verwendet habe.Ich habe vielgetan und diesist wahrscheinlicheiner der schmerzlosesten Wege,die Siegehen können.Suchen Sie die Muster und codieren Sie siein if-Anweisungen,switch-Anweisungen sowie reguläre Ausdrücke und Array-Übereinstimmungen.Wählen Sieeinfach das Beispiel auseinander,esist wirklichganzeinfach.Stellen Sie alle weiteren Fragen,die Siebenötigen.@CJN: Yes this is an alternate to using `.htaccess` the latter which I don't wish even on my worse enemies. :) Seriously, PHP is so much easier to write something robust than with `.htaccess`. Your question included '`-directory` which is why I used in my answer. I've done a lot of this and this is probably one of the most painless ways you can go. Find the patterns and code them into `if` statements, `switch` statements and regular expression and array matching. Just pick the example apart, it really is quite simple. Ask any follow up questions you need.
- 0
- 2010-08-31
- MikeSchinkel
-
@CJN: Ihre Frage wurde soformuliert,dassich dachte,Sie wollten sie vielleicht,aberja,vermeiden Sie 404s.Stellen Siefest,dass URLsein Baum von Pfadsegmenten sind,die durch Schrägstrichegetrennt sind,und schreiben Sieeinfach Logik,um dies zu handhaben.einfachteilen underobern.Undfragen Sie,ob Sie stolpern.Esmag zwar schwierig aussehen,ist abernichtmit so vielen anderen Dingen zu vergleichen,sondernnurmit Brute-Force-Inspektion und Kartierung.@CJN: Your question was worded such that I thought maybe you wanted them but yes, avoid 404s. Realize that URLs are a tree of path segments separated by slashes and just write logics to handle that; just divide and conquer. And ask if you stumble. While it may look hard it really isn't compare to so many other things, it's just brute force inspection and mapping.
- 0
- 2010-08-31
- MikeSchinkel
-
- 2010-08-29
Esgibt ein Pluginfür den Wechsel voneiner Permalink-Struktur zueiner anderen,aberichbin mir ziemlich sicher,dass diesfür Ihre Anforderungennicht ausreicht. Siemüsseneinige .htaccess-Umschreiberegeln verwenden. Ich versuche Ihneneinige Beispielefür Ihre Bedürfnisse zugeben (nicht sicher,ob sie alle korrekt sind). Fügen Sie alle diese Zeilenin eine Dateimit dem Namen ".htaccess"im Stammverzeichnis Ihres Serversein. Raus aus den WordPress-Regeln:
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On # your rules start here. Keep the following lines that has been produced by wordpress RewriteBase / RewriteRule wp/(.*)$ /$1 [R=301] RewriteRule /products-directory/(.*)$ /products-top-level-page [R=301] RewriteRule /about-directory/(.*)$ /about-top-level-page [R=301] RewriteRule /services-directory/$ /services-top-level-page [R=301] RewriteRule /same-word(.*)$ /newcategory/$1 [R=301]
Das Flag [R=301]teilt dem Client-Browser oder der Suchmaschinemit,dasses sich umeine permanente Weiterleitung handelt.
Möglicherweisemöchten Sie alle Permalinksin Ihrer WordPress-Datenbank aktualisieren. Ich habeeinen Artikel über das Aktualisieren von Zeichenfolgenin der Datenbank geschrieben. Leider habeich den Beitragnochnicht übersetzt. Die Abfragen solltenjedoch klar sein,andernfalls verwenden Sieeinfach die MySQL-Dokumente.
There is a plugin for changing from one permalink struture to another, but I am quite sure that this will not be enough for your needs. You will have to use some .htaccess rewrite rules. I try to give you some examples for your need (not sure if they are all correct). Include all those lines into a file called ".htaccess" in the root of your server. Out it above of the wordpress rules:
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On # your rules start here. Keep the following lines that has been produced by wordpress RewriteBase / RewriteRule wp/(.*)$ /$1 [R=301] RewriteRule /products-directory/(.*)$ /products-top-level-page [R=301] RewriteRule /about-directory/(.*)$ /about-top-level-page [R=301] RewriteRule /services-directory/$ /services-top-level-page [R=301] RewriteRule /same-word(.*)$ /newcategory/$1 [R=301]
The flag [R=301] will tell the client browser or search engine, that it is a permanent redirect.
You will probably want to update all the permalinks within your wordpress database. I wrote an article about updating string in the database. Unfortunately I haven't translated the post, yet. But the queries should be clear, otherwise just use the MySQL docs.
-
Junge, Vielen Dank.Es sieht so aus,als hätteich die richtigen Ideengehabt - aber schwer zu sagen,weil Sie sagen "(nicht sicher,ob sie alle richtig sind)".Ichglaubenicht,dassichmir Sorgenmachenmuss,in die Datenbank zugelangen,ummit Permalinksfertig zu werden.Ich habe WordPressentsprechendeingerichtet und habe dasgutim Griff. Nochmals vielen Dankfür Ihre Teilnahme -ichbin jetzt zuversichtlicher.boy, Thanks very much. It looks like I might have had the right ideas - but hard to tell because you say "(not sure if they are all correct)". I don't think I'll need to worry about getting into the database to deal with permalinks. I have wordpress set up appropriately and have a good handle on that. Thanks again for chiming in - I feel more confident going forward now.
-
- 2010-08-31
Ich verwende Folgendes: Einfaches 301-Weiterleitungs-Plugin - verwendetfüreinEinige Seiten zuvor,undich werdebaldmeine Webdesign-Websitemit allihren Dateien und Ordnernin meinen WP-Dateien verschieben.
I use this: Simple 301 Redirects plugin - used it for a few pages prior, and I am soon to move my web design site with all it's files and folders inside of my WP files.
Ichbefürchte,dass dies zu vielist,um hiergefragt zu werden. Wennja,können Siemirgerneeinen anderen Ort zum Lernenmitteilen.
Hilfebei Umleitungen
Ichbereinigeeine schlechtentwickelte Site undmigriere WordPress auseinem Unterverzeichnis. Ich habe stundenlang versucht,michmit der Logistik von Weiterleitungen und Regex zubeschäftigen. Ich denke,ichbekommeesin den Griff,würdemich aber übereine Bestätigung,dassich das richtigmache,und über Ratschläge zu Best Practices sehrfreuen. Wennjemandgute Tutorialsmit Beispielen kennt,würdeich das auchbegrüßen.
Wennjemand wirklich einfache Plugins dafür kennt,wäreich äußerst dankbar. Ich habemir das Redirections-Plugin angesehen,findees aber sehr verwirrend (Kopfschmerzen!). Injedem Fall sindmeine folgenden Ideen (Quellenfolgen==gt; dann Ziel) das,wasich aus den Anweisungen und Screenshots zu Weiterleitungen und anderen Tutorials,dieich durchsucht habe,zusammengestellt habe. Ichbin mir ziemlich sicher,dass sie anwendbar sind,unabhängig davon,obich sie direktin die .htaccess-Dateieingefügt oder Redirections oderein anderes Plugin verwendet habe?
Also,hierist,wasicherreichenmöchte und wieich denke,dassesgetan werdenmuss:
So verschieben Sie Wordpress aus dem Unterverzeichnisin das Stammverzeichnis:
Für alle Seiten,die sich derzeitin Unterverzeichnissenim Stammverzeichnisbefinden,möchteicheine Reihe von Seiten zueiner Seite der obersten Ebene löschen und/oder kombinieren:
Füreine Reihe von Seiten der obersten Ebene,dieeinem bestimmten Musterentsprechen,möchteich siein bestimmte Kategorieneinteilen,z. Die Dateinamenbeginnen allemit denselben zwei Wörtern wie demgleichen: same-word-Variation-Variation.html undichmöchte,dass sieihre vorhandenen Dateinamenbeibehalten. Wennichmeine Permalinks soeinstelle,dass siemit ".html"enden,funktioniert dies Ichglaube:
Wie würdeich die Regelerstellen,wennich keine Permalinks habe,die auf ".html"enden? (Ichglaubeich habegesehen! Ist das "nicht" Zeichen,abernicht sicher,wiemanes hier verwendet -istes):
Und sobaldich die spezifischen Seiten wie obenidentifiziert und umgeleitet habe,löscheich den Rest (Müll) undmöchte Benutzer zur Startseite (oder vielleicht zueinem zufälligen Beitrag?) senden.
Also 2 Fragen hier:
Wieerstelleich die Regel "Für alles außer denbereits wie oben umgeleiteten Dateien"
Wie kannich verhindern,dass diese Regel aufneue Seiten und Beiträge angewendet wird,dieich vonnun anerstelle?
Eine Ideeist,dassbeim Löscheneine 404-Seitenichtgefunden wird. Ich sollte also die Regelfür die 404-Seite selbsterstellen. Möchteich dastun?
Wieichbereits sagte,ist die Website schlechtentwickelt (der Kunde weist die Leute an,nureine Seite ohne Rücksicht auf die richtige Architektur,SEO usw. zu "werfen") - sie hatpraktisch kein Ranking oderextern/back links,um dieichmich sorgenmuss,aberichmöchte denbesten Ansatz aus Sicht der Suchmaschinenoptimierung und der richtigen Entwicklung verstehen.
Vielen Dankim Vorausfürjede Anleitung.