web-dev-qa-db-fra.com

Utilisez votre htaccess pour rediriger Wordpress vers un site Web statique dans un sous-dossier

J'ai utilisé le plugin Simply Static pour créer une copie statique de mon site Web WP. Tous les fichiers sont en /2016/ et la copie statique en /2016/a/. Que dois-je ajouter à .htaccess afin de faire WP rediriger de example.com/2016 à example.com/2016/a?

Ceci est mon .htaccess actuel:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /2016/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /2016/index.php [L]
</IfModule>
# END WordPress
1
ivanacorovic

Si vous voulez une external redirect from /2016/<anything> à /2016/a/<anything>, vous pouvez faire quelque chose comme le before les directives WordPress existantes (c'est-à-dire avant # BEGIN WordPress) dans votre fichier /2016/.htaccess:

RewriteCond %{REQUEST_URI} ^/(\d{4})/(.*)
RewriteRule !^a/ /%1/a/%2 [R,L]

La RewriteRule pattern refusée empêche que la redirection se produise lorsque le chemin URl commence déjà par a/ (par rapport au répertoire /2016/). Les références arrières %1 et %2 font référence à la correspondance CondPattern .

Notez que puisqu'il s'agit d'une redirection external , le sous-répertoire /a sera naturellement exposé à l'utilisateur. (Si vous établissez une liaison interne avec le sous-répertoire /a, il est quand même exposé.)


Sinon, si vous souhaitez réécrire en interne toutes les demandes de /2016/<anything> à /2016/a/<anything> et masquer ainsi le sous-répertoire /a (l'utilisateur ne voit que /2016/<anything>), vous pouvez effectuer les opérations suivantes:

RewriteCond %(ENV:REDIRECT_STATUS) ^$
RewriteRule (.*) a/$1 [L]

La directive RewriteCond qui vérifie la variable d’environnement REDIRECT_STATUS permet de s’assurer que cela s’applique uniquement à la demande initiale, et non à la demande réécrite, afin d’éviter une boucle de réécriture.

Notez que ce rewrite réécrira l’URL, que /a soit déjà présent ou non dans la demande initiale. par exemple. une demande pour /2016/a/<something> sera réécrite en interne à /2016/a/a/<something> (ce qui, je suppose, entraînerait probablement un 404). Mais si le but est de masquer le sous-répertoire /a, alors /a ne devrait pas être présent sur la demande en premier lieu.

Encore une fois, ceci doit aller avant les directives WordPress existantes. Le site WordPress n'est plus accessible tant que ces directives ne sont pas supprimées.

Si des URL du formulaire /2016/a/<something> ont déjà été indexées ou liées à des tiers externes, envisagez également d'inclure une redirection pour supprimer le sous-répertoire /a de l'URL (afin de préserver le référencement). Par exemple, les éléments suivants devront être avant la réécriture ci-dessus:

RewriteCond %(ENV:REDIRECT_STATUS) ^$
RewriteCond %{REQUEST_URI} ^/(\d{4})
RewriteRule ^a/(.*) /%1/$1 [R,L]

Le %1 backreference fait référence au nom du répertoire c'est-à-dire. "2016" (capturé dans le précédent CondPattern - cela évite simplement d'avoir à coder manuellement le nom du répertoire dans le substitution . $1 est une référence arrière à tout ce qui suit /2016/a/ dans le chemin URL .


Notez que les "redirections" ci-dessus (indiquées par l'indicateur R sur la RewriteRule) sont des redirections temporaires (302). S'il s'agit de permanent , remplacez R par R=301, mais uniquement après avoir confirmé que tout fonctionne correctement. Les navigateurs 301 sont fortement mis en cache par le navigateur, ce qui peut rendre les tests difficiles.

2
MrWhite