web-dev-qa-db-fra.com

Réécriture de mod spécifique à la casse sur WordPress multi-site

J'ai divisé un blog WordPress en plusieurs blogs spécifiques à une catégorie utilisant des sous-domaines, car les sujets abordés dans le blog d'origine étaient trop vastes pour être regroupés efficacement.

Les publications ont été exportées à partir du blog parent www et importées dans les blogs de sous-domaines spécifiques.

Je crois . Htaccess fournit la réécriture de mod pour tous les sous-domaines (y compris le www original) _ en un seul .htaccess fichier.

J'utilise . Htaccess pour effectuer une redirection 301 sur les catégories d'articles dans l'article correspondant sur le blog du sous-domaine, par exemple:

RedirectMatch 301 ^/auto/(.*)$ http://auto.example.com/$1

Le problème que j'ai est que la catégorie a été conservée dans la structure permalink du blog de sous-domaine, de sorte que www.example.com/auto/mercedes est maintenant auto.example.com/auto/mercedes.

La 1ère URL est redirigée vers la 2ème, mais malheureusement, la 2ème est redirigée vers auto.example.com/mercedes en utilisant la même règle de réécriture, qui n’a pas été trouvée, car le lien permanent sur le blog du sous-domaine conserve la catégorie parente de auto.

La solution consisterait à ajuster la structure de lien permanent dans les paramètres WP du sous-domaine, afin que la catégorie de niveau supérieur ne duplique pas le sous-domaine.

Ma question serait la suivante: comment puis-je retirer une partie de l'URL de publication du blog d'origine (www) de l'URL du sous-domaine lors de la redirection? Exemple: comment rediriger www.example.com/auto/mercedes vers auto.example.com/mercedes?

Je suppose que ce serait un truc d’expression classique, pour lequel je ne suis pas bon.

Mise à jour: Je pourrais être amené à utiliser:

RewriteCond %{HTTP_Host} !auto.example.com$

Par défaut, WordPress if boucle . Htaccess et sépare mes redirections personnalisées de sous-domaines en une seconde section de boucle if.

4
Steve

Wow, c'est une réponse assez compliquée . Voici comment je le ferais dans un contexte .htaccess:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_Host} =example.com     [NC,OR]
RewriteCond %{HTTP_Host} =www.example.com [NC]
RewriteRule ^(auto|foo|bar)/(.*)$ http://$1.example.com/$1/$2 [NS,L,R=301]

RewriteConds s'assure que cette règle n'est appliquée que pour example.com et www.example.com, et non pour d'autres sites. Vous pouvez supprimer le premier RewriteCond si uniquement vous souhaitez que la règle s'applique à www.example.com.

La RewriteRule redirige ensuite, par exemple, www.example.com/auto/mercedes à auto.example.com/auto/mercedes. (Si vous souhaitez qu'il redirige uniquement vers auto.example.com/mercedes, remplacez $1/$2 par uniquement $2.) L'exemple est identique pour les catégories foo et bar. ; vous pouvez ajouter autant de catégories que vous le souhaitez en modifiant simplement l'expression rationnelle.

1
Ilmari Karonen

En dix lignes, vous avez non seulement ce que vous avez demandé, mais également un avantage énorme: lorsque vous souhaitez ajouter un sujet, par exemple "newsubject", ajoutez simplement une ligne dans votre fichier de carte:

newsubject newsubject

recréez le fichier de hachage, redémarrez le serveur et le tour est joué!


Alors voici la version "compressée":

 RewriteMap mapsubdomains \
   dbm:/web/htdocs/mysite/rewriterules/mapsubdomains.map
 RewriteCond %{HTTP_Host} (([a-zA-Z0-9\-]+)\.)([a-zA-Z0-9\-]+)\.com$
 RewriteRule (.*) - [QSA,E=PART1:${mapsubdomains:%1|notfound}]
 RewriteCond %{ENV:PART1} ^$ [OR]
 RewriteCond %{ENV:PART1} notfound
 RewriteRule ^/([a-zA-Z]+)/(.*)$ - [QSA,E=SUBJECT:${mapsubdomains:%1|notfound}]
 RewriteCond %{ENV:SUBJECT} !^$
 RewriteCond %{ENV:SUBJECT} !(notfound)
 RewriteRule ^/([a-zA-Z]+)/(.*)$ http://%{ENV:SUBJECT}.mysite.com/$2 [QSA,L]

Réponse détaillée:

(1) utilisez un fichier map où vous écrirez des choses simples comme ceci:

auto    auto
moto    moto

puis incluez-le dans votre règle de réécriture:

 RewriteMap mapsubdomains \
   dbm:/web/htdocs/mysite/rewriterules/mapsubdomains.map

faites ensuite une règle générique:

 RewriteCond %{HTTP_Host} (([a-zA-Z0-9\-]+)\.)([a-zA-Z0-9\-]+)\.com$
 RewriteRule (.*) - [QSA,E=PART1:${mapsubdomains:%1|notfound}]

La règle précédente signifie: si les hôtes ont deux parties (par exemple http://part1.part2.com), recherchez-le dans le sous-domaine maps et remplissez-le avec la bonne valeur o "non trouvé" s'il n'est pas trouvé.

Ensuite, si "non trouvé", cela signifie que vous pouvez vérifier l'URL:

 # if PART1 empty:
 RewriteCond %{ENV:PART1} ^$ [OR]
 # ...or PART1 not found:
 RewriteCond %{ENV:PART1} notfound
 # ...then lookup: 
 RewriteRule ^/([a-zA-Z]+)/(.*)$ - [QSA,E=SUBJECT:${mapsubdomains:%1|notfound}]

 # if subject not empty, and is found then redirect:
 RewriteCond %{ENV:SUBJECT} !^$
 RewriteCond %{ENV:SUBJECT} !(notfound)
 RewriteRule ^/([a-zA-Z]+)/(.*)$ http://%{ENV:SUBJECT}.mysite.com/$2 [QSA,L]
1
Olivier Pons