Création de redirections 301 pour les URL de publication, de page, de catégorie et d'image?
3 réponses
- votes
-
- 2010-08-30
Bonjour @CJN: ,
Votrepremière question,le déplacement du répertoire WordPressestgéré différemment des autres.
Déplacement de WordPress du sous-répertoire vers la racine:
Allez dans
/wp-config.php
et ajoutez ce qui suit aux définitions (en utilisant le domaine de votre client au lieu deexample.com
bien sûr):define('WP_SITEURL', 'http://example.com'); define('WP_HOME', WP_SITEURL);
301 Redirections à l'aide de
template_loader
etwp_safe_redirect()
Vouspouvez résoudre laplupart des autres questionsen modifiant
.htaccess
comme @ Kau-Boy montre comment,ou vouspouvez simplement lefaireen PHP . WordPress a un hooktemplate_redirect
que vouspouvez utiliserpour cela avec lafonctionwp_safe_redirect()
pour rediriger avec un code d'état HTTP301
. Comme vouspouvez le voir,le resten'est que dubrutpour le code PHPet unpeu demagie d'expression régulière saupoudré. Vouspouvezplacer ce codepratiquementn'importe où dans lefichierfunctions.php
de votrethème: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(); } }
Pensez à la convivialitéet pas seulement au référencement?
Je vous demande si vous voulez vraimentfaire le # 2? IMO qui rend un sitebeaucoupmoins utilisablepour les utilisateurs qu'un site optimisé uniquementpour le référencementperçu (eten tant quefondateuret co-organisateur unique de cegroupe Jene suispas unnéophyte du référencement.) Jepréfère de loin que vous déposiez simplement le
"-directory"
dupremier segment de l'URL chemin. JMTCW quandmême.Génération de 404pages?
Si vous devez émettre un 404,vouspouvez lefaire avec l'en-tête:
header("HTTP/1.0 404 Not Found"); exit;
Cependant,je pense que cen'estpas ce que vous voulezfaire,n'est-cepas? Jepense que vouspouvez atteindre la logique de redirection dont vous avezbesoinen modifiant lafonction PHP ci-dessuset en répondant à la requête HTTP avec un
301
,non?Importation d'images dans lamédiathèqueet redirection 301
Vouspourriez les déplacer dans lamédiathèque,ce qui vouspermettrait de lesgérer à l'avenir. Voici unplugin quipourrait aider (même sije ne suispas sûr qu'ilfonctionne avec la version 3.0; sinon,cepourrait être unebonnebase de code avec laquelletravailler detoutefaçon):
Redirection d'URL d'image 301 codéeen dur à l'aide d'untableau
Ensuite,comme ce serait une choseponctuelle ,vouspouvez simplement coderen dur les URL de vosimages dans untableau et les utiliserpour correspondre dans votrefonction de redirection. Enmodifiant la valeurpar défaut dans l'instruction switch àpartir du code ci-dessus,celapourrait ressembler à ceci:
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 } }
Utilisation de
preg_match()
pour rediriger lesimages 301parmodèle d'URLBien sûr,si vos URL d'image suivent unmodèle,vouspouvez rationaliser unegrandepartie ou latotalité dutableau d'imagesen utilisant un
preg_match()
à laplace,comme ceci:if (preg_match('#^/images/(.*)$#',$url_path,$match)) { $redirect_to = "/wp-content/uploads/2010/08/{$match[1]}"; }
J'espère que cela vous aidera?
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?
-
Salut Mike, Commetoujours,vous êtesincroyable -très utileet minutieusementminutieux! Mais - cela a l'airtrèseffrayantet je crains deme mettre au-dessus dematêteen ce qui concerne lefait dejouer avec lesfichiersphpet core ... Dans lapremièrepartie de votre réponse,vous dites queje peux lefaire avec .htaccess comme lemontre @ Kau-Boy,donc votre réponseest une alternative à cela,n'est-cepas? Aupointn ° 2,les répertoires sontjuste "/products/"etc.,pas de "-directory" -il y a unnombre énorme de répertoiresinutiles avec un énorme # defichiersinutiles à l'intérieur,je voulais unmoyen sans douleur deme débarrasser de"tout sauf" lapage deniveau supérieur dans unpetit nombre de répertoires.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.
-
Et,re: "Générer 404" - Je veux éviter degénérer des 404,n'est-cepas?J'essaye detout «attraper» avec les 301.Cetteidée était que cepourrait être unmoyenfacile de rediriger "tout sauf" les quelquespages quej'identifie dansmes 301 autres règles - supprimez donctout sauf ces quelquespages;au lieu que l'utilisateur obtienne un 404,ilest redirigé vers lapage d'accueil/aléatoire quej'ai définie?Mais,est-ce sage defaireface à cela? Il s'avère quebeaucoup de répertoiresinutiles ont également leurpropre dossier d'images,doncplus de douleur avec ça ... Quoi qu'ilen soit,j'apprécie vraimenttoute votre aide (iciet sur d'autresforums sur lesquelsje vous vois).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: Oui,c'est une alternative à l'utilisation de `.htaccess` ce dernier queje ne souhaitemêmepas àmespiresennemis.:) Sérieusement,PHPesttellementplusfacile d'écrire quelque chose de robuste qu'avec `.htaccess`.Votre question comprenait «-directory»,c'estpourquoij'ai utilisé dansma réponse.J'aifaitbeaucoup de celaet c'estprobablement l'une desmanières lesplusfaciles à utiliser.Trouvez lesmodèleset codez-les dans desinstructions `if`,desinstructions` switch`et des correspondances d'expressions régulièreset detableaux.Il suffit deprendre l'exemple àpart,c'est vraiment assez simple.Poseztoutes les questions complémentaires dont vous avezbesoin.@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: Votre question étaitformulée detelle sorte queje pensais que vous les vouliezpeut-être,mais oui,évitez les 404.Comprenez que les URL sont une arborescence de segments de chemin séparéspar desbarres obliqueset écrivez simplement des logiquespourgérer cela;juste diviseret conquérir.Et demandez si voustrébuchez.Bien que celapuisse sembler difficile,cen'est vraimentpas comparable àtant d'autres choses,c'estjuste uneinspectionet une cartographieparforcebrute.@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
Ilexiste unpluginpourpasser d'une structure depermalien à une autre,maisje suis sûr que celane suffirapas à vosbesoins. Vous devrez utiliser des règles de réécriture .htaccess. J'essaye de vous donner quelquesexemplespour votrebesoin (jene saispas s'ils sonttous corrects). Inclueztoutes ces lignes dans unfichier appelé ".htaccess" à la racine de votre serveur. Au-dessus des règles de wordpress:
# 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]
L'indicateur [R=301]indiquera aunavigateur client ou aumoteur de recherche qu'il s'agit d'une redirectionpermanente.
Vous voudrezprobablementmettre àjourtous lespermaliens de votrebase de données wordpress. J'ai écrit un article sur lamise àjour de la chaîne dans labase de données . Malheureusement,je n'aipasencoretraduit lemessage. Mais les requêtes doivent être claires,sinon utilisez simplement la documentation MySQL.
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.
-
garçon, Mercibeaucoup.Il semble quej'aiepeut-êtreeu lesbonnesidées -mais difficile à direparce que vous dites "(jene saispas sielles sonttoutes correctes)".Jene pensepas quej'auraibesoin dem'inquiéter d'entrer dans labase de donnéespourgérer lespermaliens.J'ai configuré wordpress demanière appropriéeet j'ai unebonnemaîtrise de cela. Merciencore d'avoir répondu -je me sensplus confiantpour l'avenir.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
J'utilise ceci: Plugin Simple 301 Redirects - utilisépour unquelquespages auparavant,et je vaisbientôt déplacermon site de conception Web avectous sesfichierset dossiers à l'intérieur demesfichiers WP.
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.
Je crains que cene soittrop demanderici,alors si c'est le cas,n'hésitezpas àme parler d'un autreendroitpour apprendre.
Aide sur les redirections
Jenettoie un sitemal développéet jemigre wordpress depuis un sous-répertoire. J'aipassé des heures àessayer de comprendre la logistique des redirectionset des regex. Jepense queje suisen train de comprendre,maisj'apprécierais vraiment la confirmation queje fais cela correctement,et tout conseil sur lesmeilleurespratiques. Si quelqu'un connaît debonstutoriels avec desexemplespratiques,je l'apprécierais aussi.
Si quelqu'un connaît desplugins vraiment simplespour cela,je seraisextrêmement reconnaissant. J'ai regardé leplugin Redirections,maisje letrouvetrès déroutant (mal detête!). Danstous les cas,mesidées ci-dessous (les sources sont suivies de=>puis cible) sont ce quej'ai rassemblé àpartir desinstructions de redirectionet des captures d'écranet d'autrestutoriels quej'aiparcourus. Je suis àpeuprès sûr qu'ils seraient applicables,queje lesmette directement dans lefichier .htaccess ou quej'utilise des redirections ou un autreplugin?
Alors,voici ce quej'essaie d'accompliret commentje pense que cela doit êtrefait:
Pour déplacer Wordpress du sous-répertoire vers la racine:
Pourtoutes lespages actuellement dans des sous-répertoires à la racine,je souhaite supprimeret/ou combiner untas depagesen une seulepage deniveau supérieur:
Pour untas depages depremierniveau correspondant à unmodèle spécifique,je souhaite les diriger vers des catégories spécifiques,parexemple lesnoms defichiers commencenttouspar les deuxmêmesmots comme celui-ci: same-word-variation-variation.htmlet je veux qu'ils conservent leursnoms defichiersexistants - sije configuremespermalienspour qu'ils seterminentpar `.html`,celafonctionnera,Je crois:
Comment créer la règle sije n'aipas depermaliens seterminantpar `.html`? (Jepense quej'ai vu! Est le caractère "pas",maisje ne saispas comment l'utiliserici -est-ce):
Etpuis,unefois que lespages spécifiques serontidentifiéeset redirigées comme ci-dessus,je supprimeraitout le reste (poubelle)et je veuxenvoyer les utilisateurs vers lapage d'accueil (oupeut-être unmessage aléatoire?).
Donc,2 questionsici:
Commentpuis-je créer la règle qui dit "pourtout sauf lesfichiers déjà redirigés comme ci-dessus,faites ceci"
Commentpuis-jeempêcher cette règle de s'appliquer auxnouvellespageset publications queje crée àpartir demaintenant?
Uneidéeest qu'en supprimant,j'obtiendrais unepage 404introuvable,doncje devrais créer la règlepour lapage 404elle-même? Est-ce ce queje veuxfaire?
Commeje l'ai dit,le site a étémal développé (avec le client demandant auxgens de simplement "lancer unepage" sans se soucier de l'architecture appropriée,du référencement,etc.) -iln'apratiquement aucun classement ou/back liens dontje doism'inquiéter,maisje veux comprendre lameilleure approche dupoint de vue du référencementet du développement approprié.
Merci d'avancepourtous les conseils.