Multisite: Develop locally using production images with .htaccess

All we need is an easy explanation of the problem, so here it is.

I work on a multisite WordPress installation (see – https://codex.wordpress.org/Create_A_Network), I don’t want to have to download all the remote production images to test the sites on my local environment.

The following .htaccess to rewrite example allows images to be pulled direct from a live WordPress site:

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

See – https://css-tricks.com/develop-locally-use-images-production/, this describe the normal standalone WordPress installation.

Can anyone adapt this to work for a Multisite install i.e. one that encompasses multiple WordPress blogs on different domains?

I’ve tried the following, to map requests for specific local sub-domains, but no success:

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

How to solve :

I know you bored from this bug, So we are here to help you! Take a deep breath and look at the explanation of your problem. We have many solutions to this problem, But we recommend you to use the first method because it is tested & true method that will 100% work for you.

Method 1

The following .htaccess to rewrite example …

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

Just to note… this will result in an external redirect (as if R=302 was included on the RewriteRule directive), not simply a "rewrite" (as is suggested) – even without the R flag. So, the browser will issue two requests for every resource in the uploads directory. This might be OK whilst developing in a local test environment (as you are doing), but you’d never do something like this in production, as it could literally make your site grind to a halt if you have many external resources. (To do this properly, you would need to configure your server as a reverse proxy and use mod_proxy to "proxy" the request.)

If you specify an absolute URL (ie. with scheme + hostname) in the RewriteRule substitution then Apache will implicitly trigger an external redirect.


To make the above target a specific domain (eg. local.example.com), you just need to add an additional condition that checks the Host header. For example:

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

Some notes about the above:

  • (.*) is the same as ^(.*)$ – the anchors are unnecessary.
  • Likewise, .*$ (which simply matches anything at the end of the URL) is superfluous.
  • No need to backslash escape slashes in the character class: [^/] is the same as [^\/].
  • Match 1 or more characters in the path segment, not 0 or more. ie. [^/]+ instead of [^/]*.
  • I’ve added the R, since you might as well make it clear what is really happening.

But, you don’t actually need the second RewriteCond that matches against the REQUEST_URI. It is more efficient to move this to the RewriteRule pattern, since the RewriteRule pattern is processed first. For example, the above could be rewritten as:

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

Note: Use and implement method 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply