web-dev-qa-db-fra.com

L'installation de WordPress avec le chemin / wp conduit à une boucle de redirection lorsque index.html redirige vers un panier d'achat

Donc, sur mon site, mon panier se trouve à l'adresse example.com/zc2

J'utilise ce fichier .htaccess

RewriteEngine On

Redirect /index.html example.com/zc2/

Ainsi, toute personne qui atterrira sur example.com sera redirigée vers mon panier.

Tout va bien, mais maintenant, si j'essaie d'installer WordPress sur example.com/wp, les navigateurs restent bloqués dans une boucle de redirection.

Je suis certain que c'est mon fichier .htaccess mal conçu.

Que puis-je faire pour résoudre ce problème?

2
Monkeybus
RewriteEngine On

Redirect /index.html example.com/zc2/

De côté: Je suppose que cela doit être une "faute de frappe" dans votre question, mais cette directive mod_alias Redirect est complètement invalide (il vous manque un protocole de l'URL cible) serveur avec une erreur de serveur interne 500 - "Rediriger vers une non-URL" !?

De plus, RewriteEngine (mod_rewrite) et Redirect (mod_alias) sont des directives non liées de différents modules Apache.

Que puis-je faire pour résoudre ce problème?

Cependant, je soupçonne que la "boucle de redirection" pourrait être causée par un fichier WordPress .htaccess mal configuré dans le sous-répertoire /wp. Si vous réécrivez par inadvertance dans la racine du document au lieu du sous-répertoire /wp, vous obtiendrez une boucle de redirection.

La directive Redirect est également "préfixe-correspondant" - elle correspond à toute URL qui commence par l'URL source. Si vous envisagez de rediriger un chemin spécifique (c'est-à-dire la racine du document), il serait préférable d'utiliser une directive RedirectMatch (ou mod_rewrite RewriteRule - voir plus loin). Par exemple:

RedirectMatch 302 ^/(index\.html)?$ https://example.com/zc2/

Ceci ne fait plus que correspondre à / (ou /index.html) et redirige vers example.com/zc2/.

Utiliser mod_rewrite (RewriteRule) à la place

La directive mod_alias (Redirect ou RedirectMatch) du fichier racine du document .htaccess est toujours traitée (héritée) lorsqu'il existe d'autres fichiers .htaccess dans les sous-répertoires (c'est-à-dire le fichier WordPress _ /wp/.htaccess fichier).

Pour éviter que le fichier redirect dans le fichier racine .htaccess interfère avec votre installation WordPress, puis modifiez le mod_alias Redirect (ou RedirectMatch) dans le fichier racine de votre document .htaccess dans un fichier mod_rewrite RewriteRule.

Par exemple:

RewriteEngine On

RewriteRule ^(index\.html)?$ https://example.com/zc2/ [R=302,L]

Les directives mod_rewrite du fichier WordPress .htaccess situé à /wp/.htaccess écraseront complètement les directives mod_rewrite du fichier parent .htaccess (à la racine du document), évitant ainsi toute possibilité de conflit. Les directives mod_rewrite du fichier racine .htaccess ne sont même pas traitées.

(Notez que cela dépend du comportement par défaut d'Apache, où les directives mod_rewrite ne sont pas héritées.)

Considérant que, lorsqu'un mod_alias Redirect est utilisé, la directive mod_alias du fichier parent .htaccess est toujours traitée (qu’elle corresponde ou non) - conflit possible.

Si vous accédez à example.com/, la redirection vers example.com/zc2/ se produit toujours.

Notez que j'ai utilisé les redirections 302 (temporaires) ci-dessus. Modifiez-les en 301 (permanent) - si tel est l'intention - uniquement lorsque vous avez confirmé que tout fonctionne correctement. Ceci permet d'éviter tout problème de cache potentiel.

1
MrWhite

Il ne devrait pas être nécessaire d'utiliser une règle ou une condition de redirection, car vous redirigez simplement la base vers un sous-dossier et, par conséquent, ces sous-dossiers, s'ils sont liés, n'auraient pas besoin de la redirection.

Essayez quelque chose comme ceci dans le fichier /.htaccess:

Redirect 301 / https://example.com/zc2/

alors ceci dans votre fichier /WordPress/.htaccess:

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