web-dev-qa-db-fra.com

Comment configurer nginx pour rediriger les demandes vers le répertoire de téléchargement sur le serveur de production?

Je commence juste à me mouiller les pieds avec Nginx. Dans le passé, j’utilisais un fichier .htaccess dans/wp-content/uploads. Par conséquent, si mon serveur de développement ou intermédiaire n'a pas le fichier, il le redirige vers le serveur de production:

<IfModule mod_rewrite.c>
  RewriteEngine On

  RewriteBase /wp-content/uploads/
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*) http://production.server.com/m/wp-content/uploads/$1 [L,P]

</IfModule>

Je n'ai pas de chance avec cela dans nginx. C'est peut-être en partie parce que cette fois-ci, mon site est dans un sous-répertoire (/ m /).

# Tells nginx which directory the files for this domain are located
root         /srv/www/example/htdocs;
index               index.php;

    # Subdirectory location settings

    location /m {
            index index.php;
            try_files $uri $uri/ /m/index.php?$args;
            location /m/wp-content/uploads {
                    try_files $uri $uri/ @prod_svr;
            }
    }
    location @prod_svr {
            proxy_pass http://production.server.com/m/wp-content/uploads$uri;
    }

Toutes les idées seraient grandement appréciées.

6
Colin

Vous pouvez essayer quelque chose comme ça:

server {
    root /srv/www/example/htdocs;
    index index.php;

    # Matches any URL containing /wp-content/uploads/    
    location ~ "^(.*)/wp-content/uploads/(.*)$" {
        try_files $uri @prod_serv;
    }

    # Will redirect requests to your production server
    location @prod_serv {
        rewrite "^(.*)/wp-content/uploads/(.*)$" "http://yourdomain.com/m/wp-content/uploads/$2" redirect;
    }

    # The rest of your location blocks...
    location /m {
        index index.php;
        try_files $uri $uri/ /m/index.php?$args;
    }
}
4
Ben Cole

Si utile à quiconque, j’ai une configuration similaire à celle que j’utilise dans mes environnements WordPress localhost pour gérer cela avec quelques différences utiles:

  1. J'aime définir mon environnement de production à l'aide d'une variable, ce qui me permet de le réutiliser rapidement dans plusieurs blocs de serveur.
  2. J'interromps la réécriture plutôt que la redirection, ce qui évite les problèmes avec d'autres demandes pouvant correspondre à la même URL

Voici un exemple de base:

server {
    server_name mywebsite.dev;
    set $production mywebsite.wpengine.com;

    # Redirect requests to /wp-content/uploads/* to production server
    location @prod_uploads {
        rewrite "^(.*)/wp-content/uploads/(.*)$" "https://$production/wp-content/uploads/$2" break;
    }

    # Rule for handling requests to https://mywebsite.dev/wp-content/uploads/
    location ~ "^/wp-content/uploads/(.*)$" {
        try_files $uri @prod_uploads;
    }
}

En pratique, j'inclus en fait la règle location ~ "^/wp-content/uploads/(.*)$" dans un fichier inclus appelé wp-common.conf. Cela me permet d’exécuter le commutateur $ production sur de nombreux environnements différents avec le même ensemble de règles de configuration WordPress nginx communes.

0
Kevin Leary