web-dev-qa-db-fra.com

Multisite: Développer localement à l'aide d'images de production avec .htaccess

Je travaille sur une installation WordPress multisite (voir - https://codex.wordpress.org/Create_A_Network ), je ne souhaite pas télécharger toutes les images de production distantes pour tester les sites dans mon environnement local.

L'exemple de .htaccess pour réécrire suivant permet d'extraire des images directement d'un site WordPress en direct:

RewriteCond %{REQUEST_URI} ^/wp-content/uploads/[^\/]*/.*$
RewriteRule ^(.*)$ http://example.com/$1 [QSA,L]

Voir - https://css-tricks.com/develop-locally-use-images-production/ , ceci décrit l’installation autonome normale de WordPress.

Quelqu'un peut-il adapter cela pour fonctionner avec une installation multisite, c'est-à-dire une installation englobant plusieurs blogs WordPress sur différents domaines?

J'ai essayé ce qui suit, pour mapper les demandes de sous-domaines locaux spécifiques, mais sans succès:

RewriteCond %{HTTP_Host} ^local\.example\.com/wp-content/uploads/[^\/]*/.*$
RewriteRule ^(.*)$ http://www.example.com/$1 [QSA,L]
1
benedict_w

Le .htaccess suivant pour réécrire l'exemple ...

RewriteCond %{REQUEST_URI} ^/wp-content/uploads/[^\/]*/.*$
RewriteRule ^(.*)$ http://example.com/$1 [QSA,L]

Juste pour noter ... cela entraînera une external external (comme si R=302 était inclus dans la directive RewriteRule), pas simplement une "réécriture" (comme suggéré) - même sans l'indicateur R. Ainsi, le navigateur émettra deux demandes pour chaque ressource du répertoire de téléchargement. Cela pourrait convenir lors du développement dans un environnement de test local (comme vous le faites), mais vous ne feriez jamais quelque chose comme cela en production, car cela pourrait littéralement arrêter votre site Grind si vous avez beaucoup de ressources externes. (Pour le faire correctement, vous devez configurer votre serveur en tant que proxy inverse et utiliser mod_proxy pour "proxy" la demande.)

Si vous spécifiez une URL absolue (c'est-à-dire avec schéma + nom d'hôte) dans la variable RewriteRule substitution , Apache déclenchera implicitement une redirection externe.


Pour faire de la cible ci-dessus un domaine spécifique (par exemple, local.example.com), il vous suffit d'ajouter une condition supplémentaire qui vérifie l'en-tête Host. Par exemple:

RewriteCond %{HTTP_Host} ^local\.example\.com
RewriteCond %{REQUEST_URI} ^/wp-content/uploads/[^/]+/
RewriteRule (.*) http://example.com/$1 [R,QSA,L]

Quelques notes sur ce qui précède:

  • (.*) est identique à ^(.*)$ - les ancres sont inutiles.
  • De même, .*$ (qui correspond simplement à n'importe quoi à la fin de l'URL) est superflu.
  • Inutile de supprimer les barres obliques inverses dans la classe de caractères: [^/] est identique à [^\/].
  • Faites correspondre 1 ou plusieurs caractères dans le segment de chemin, pas 0 ou plus. c'est à dire. [^/]+ au lieu de [^/]*.
  • J'ai ajouté la variable R, car vous pourriez aussi bien préciser ce qui se passe réellement.

Mais vous n'avez pas réellement besoin de la deuxième RewriteCond qui correspond au REQUEST_URI. Il est plus efficace de déplacer ceci vers la RewriteRule pattern , puisque la RewriteRule pattern est traitée en premier. Par exemple, ce qui précède pourrait être réécrit comme suit:

RewriteCond %{HTTP_Host} ^local\.example\.com
RewriteRule ^wp-content/uploads/[^/]+/ http://example.com%{REQUEST_URI} [R,QSA,L]
3
MrWhite