Je souhaite déplacer mon domaine de example.com vers example.dev et également définir un caractère générique en avant. J'utilise WordPress pour les blogs, maintenant je veux que tous les articles et pages soient déplacés vers la nouvelle adresse mais je veux que certaines pages restent accessibles avec mon ancienne adresse. Par exemple:

example.com/post -> example.dev/post
example.com/post2 -> example.dev/post2
[all posts be redirected]
example.com/page1 -> example.dev/page1
example.com/page2 -> example.dev/page2
[...]
example.com/pageN -> example.com/pageN (remain Same URL)
example.com/PageX -> accessible from both domains

De plus, si quelqu'un accède à page2 avec le nouveau domaine (comme example.dev/page2), il doit être redirigé vers le domaine précédent (example.com/page2).

Je ne peux pas comprendre comment le faire en htaccess ou de toute autre manière. Je dois mentionner que je n'ai pas SSH accès au serveur. C'est un hôte partagé avec plusieurs sites.

J'ai vérifié et les gens ont eu le même problème mais avec deux installations WordPress, je veux que cela soit fait sur mon site WordPress existant et singulier.

1
ARH 6 nov. 2020 à 10:33

1 réponse

Meilleure réponse

Donc, en résumé:

  • Deux domaines pointent vers le même site Web : example.com et example.dev
  • Certaines URL ne doivent être accessibles qu'à example.com (redirection sinon).
  • Certaines URL doivent être accessibles sur les deux domaines (pas de redirection)
  • Sinon, redirigez toutes les demandes vers example.dev.

Essayez ce qui suit en haut de votre fichier racine .htaccess, avant le contrôleur frontal WordPress.

Nous pouvons utiliser une variable d'environnement TARGET_DOMAIN pour définir le domaine (le cas échéant) via lequel une URL particulière doit être accessible, puis l'utiliser plus tard pour déclencher la redirection.

# Prevent rewritten requests (to the WP front-controller) from being redirected
RewriteCond %{ENV:REDIRECT_STATUS} .
RewriteRule ^ - [L]

# The TARGET_DOMAIN environment variable holds the desired target domain (if any)
#  - for the requested URL
# eg. "example.com" or "example.dev" or empty for no redirect / accessible from both.

# Set the "default" target domain
#  - Any URLs not listed below will redirect to this domain
RewriteRule ^ - [E=TARGET_DOMAIN:example.dev]

# URLs that should be redirected to (or remain at) the other domain
RewriteCond %{REQUEST_URI} ^/bio [OR]
RewriteCond %{REQUEST_URI} ^/computing [OR]
RewriteCond %{REQUEST_URI} ^/contact [OR]
RewriteCond %{REQUEST_URI} ^/donate [OR]
RewriteCond %{REQUEST_URI} ^/encrypt [OR]
RewriteCond %{REQUEST_URI} ^/genderless-pronouns [OR]
RewriteCond %{REQUEST_URI} ^/gnu-linux-controversy [OR]
RewriteCond %{REQUEST_URI} ^/legal [OR]
RewriteCond %{REQUEST_URI} ^/readings [OR]
RewriteCond %{REQUEST_URI} ^/now
RewriteRule ^ - [E=TARGET_DOMAIN:example.com]

# URLs that should not be redirected - accessible from both domains
#  - Sets TARGET_DOMAIN to empty string (ie. no target domain)
#  - Must also exclude static resources (images, CSS, JS, etc.) from being redirected
RewriteCond %{REQUEST_URI} ^/login [OR]
RewriteCond %{REQUEST_URI} ^/admin [OR]
RewriteCond %{REQUEST_URI} ^/wp-admin [OR]
RewriteCond %{REQUEST_URI} ^/wp-login [OR]
RewriteCond %{REQUEST_URI} \.(php|css|js|jpg|gif|webp)$ [NC,OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [E=TARGET_DOMAIN]

# Redirect to the desired TARGET_DOMAIN (if any)
#  - if not already at the TARGET_DOMAIN
RewriteCond %{ENV:TARGET_DOMAIN} .
RewriteCond %{HTTP_HOST}@@%{ENV:TARGET_DOMAIN} !^([a-z0-9.-]+)@@\1$
RewriteRule ^ https://%{ENV:TARGET_DOMAIN}%{REQUEST_URI} [R=302,L]

Explication supplémentaire:

RewriteCond %{REQUEST_URI} ^/bio [OR]

Je suis revenu à l'utilisation d'une correspondance d'expression régulière (regex). Cela vous donne une plus grande flexibilité au détriment d'une complexité supplémentaire (bien que vous puissiez mélanger les deux). Ce qui précède correspond à toute URL qui commence par /bio. Ainsi, il correspondra également à /bio/ et /bioanything. Utilisez une ancre de fin de chaîne ($) pour correspondre à /bio uniquement. par exemple. ^/bio$.

L'utilisation d'une expression régulière sera nécessaire pour éviter de rediriger toute URL qui commence /wp-admin.

RewriteCond %{REQUEST_URI} \.(php|css|js|jpg|gif|webp)$ [NC,OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [E=TARGET_DOMAIN]

Notez qu'en plus de certaines URL demandées (/login, /admin, etc.) les ressources statiques (images, CSS, JS, etc.) doivent également être exclues de la redirection.

RewriteCond %{ENV:TARGET_DOMAIN} .
RewriteCond %{HTTP_HOST}@@%{ENV:TARGET_DOMAIN} !^([a-z0-9.-]+)@@\1$
RewriteRule ^ https://%{ENV:TARGET_DOMAIN}%{REQUEST_URI} [R=302,L]

La première condition garantit que nous n'essayons de rediriger que lorsqu'un domaine cible est défini. La deuxième condition vérifie si le domaine actuellement demandé (c'est-à-dire l'en-tête Host) est différent du TARGET_DOMAIN. Si ces deux vérifications réussissent, il redirige vers le domaine cible sur la même URL.

Assurez-vous que le cache de votre navigateur est vide avant de tester et testez d'abord avec une redirection 302 (temporaire) pour éviter les problèmes potentiels de mise en cache.

1
MrWhite 7 nov. 2020 à 11:20