web-dev-qa-db-fra.com

NGinx + Wordpress Subdomain Multi avec noyau dans le sous-répertoire

J'ai un WordPress install qui fonctionne parfaitement sur un serveur Apache . Je suis actuellement en train de changer mon hébergeur (la nouvelle offre NGinx) et ma pile de développement (passage à vvv).

Voici comment l'installation est configurée:

C’est une installation multi-sites de sous-domaines Wordpress, avec core dans un sous-dossier (/ wp-app /), wp-content dans un autre sous-dossier (/ wp-app-content /) et bien sûr mon index.php , wp-config.php et .htaccess dans le dossier racine avec ces 2 dossiers.

Voici mon problème :

Sur la version de production (Apache), l’administrateur fonctionne parfaitement et le dossier/wp-app/est complètement masqué. Sur la version dev (NGinx), l’administrateur fonctionne partiellement, mais beaucoup de pages renvoient un 404 et parfois WP réécrivent l’url avec wp-app.

Ce que je pense est la source du problème :

Je suis presque sûr que mes réécritures NGinx ne sont pas bonnes. J'ai trouvé plusieurs flux mentionnant le problème, mais ils étaient soit restés sans réponse, soit la réponse était partielle et ne fonctionnait pas pour moi.

Mon fichier .htaccess qui fonctionne :

# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) wp-app/$1 [L]
RewriteRule ^(.*\.php)$ wp-app/$1 [L]
RewriteRule . index.php [L]

# END WordPress

Mon nginx.conf qui fonctionne partiellement :

server {

    listen       80;
    listen       443 ssl;
    server_name  guillaumemolter.dv *.guillaumemolter.dv 

    root        /srv/www/guillaumemolter/htdocs;
    index index.php;

    if (!-e $request_filename) {
        rewrite /wp-admin$ $scheme://$Host$uri/ last;
        rewrite ^/(wp-.*.php)$ /wp-app/$1 last;
        rewrite ^/(wp-(content|admin|includes).*) /wp-app/$1 last;
    }

    location / {
        #try_files $uri $uri/ /wp-app/index.php?$args ;
        try_files $uri $uri/ /index.php?$args ;
    }

    location ~ \.php$ {
        #try_files /wp-app/$uri =404;
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000; 
    }

    location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|Zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        access_log off; log_not_found off; expires max;
    }

    location = /robots.txt { access_log off; log_not_found off; }
    location ~ /\. { deny  all; access_log off; log_not_found off; }
}

Les 2 lignes commentées sont des tests que j'ai faits en désespoir de cause ....

Ressources que j'ai lues et utilisées jusqu'à présent:

https://codex.wordpress.org/Nginxhttps://rtcamp.com/wordpress-nginx/tutorials/multisite/ Et d'autres, y compris 2 flux de ce site, que je ne peux pas poster ici parce que je n'ai pas assez de réputation.

Merci beaucoup pour votre aide.

4
guillaume.molter

J'utilise un serveur Nginx très similaire, mais ce qui suit est idéal pour moi. Toutefois, je préfère prendre un itinéraire différent et diviser la configuration des blocs de serveur pour "Non Secure - http" et "Secure - https" individuellement. Toujours selon la structure de votre sous-répertoire, vous voudrez jeter un coup d'œil à cet article rtcamp afin d'ajuster votre directive location / {} comme suit:

# HTTPS Secure Server 
#
server {
    listen 443 default_server ssl;

    ssl on;
    ssl_certificate /path/to/ssl/certificate.crt;
    ssl_certificate_key /path/to/ssl/certificate.key;

    ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout  10m;

   # Nginx 1.6 PCI compliance ssl directives, the first one is stronger but slower
   #It should be preferred when saving credit card and/or sensible information is needed.
   #e.g. If redirecting to payment gateways providers such as Paypal is all you need, them it can be safely disabled here.

  # ssl_ciphers  HIGH:!aNULL:!MD5;

    ssl_ciphers HIGH:!aNULL:!MD5:!kEDH;
    ssl_prefer_server_ciphers  on;

    root /srv/www/guillaumemolter/htdocs;
    index index.php;

    server_name guillaumemolter.dv *.guillaumemolter.dv;

    location / {
     try_files $uri $uri/ /wp-app/index.php?q=$uri&$args;
    }
}

    location ~ \.php$ {
            try_files      $uri = 404;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
    }

# Alternatively Pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

    #location ~ \.php$ {
            #try_files $uri =404;
            #fastcgi_split_path_info ^(.+\.php)(/.+)$;
            #fastcgi_pass unix:/var/run/php5-fpm.sock;
            #fastcgi_index index.php;
#                #include fastcgi_params;
    #}

    location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) {
            add_header Cache-Control public;
            add_header Cache-Control must-revalidate;
            expires 7d;
            access_log off;
    }

}

..

server {
    listen 80 default_server;
    server_name  guillaumemolter.dv *.guillaumemolter.dv 

    root   /srv/www/guillaumemolter/htdocs;
    index  index.php;

    # Simple redirect - Force non SSL site to redirect traffic to SSL
    return 301 https://guillaumemolter.dv$request_uri;
    return 301 https://guillaumemolter.dv$request_uri;


    if (!-e $request_filename) {
            rewrite /wp-admin$ $scheme://$Host$uri/ permanent;         
            rewrite ^/wp-app(/[^/]+)?(/wp-.*) /wp-app$2 last;      
            rewrite ^/wp-app(/[^/]+)?(/.*\.php)$ /wp-app$2 last;
    }

    location / {
            try_files $uri $uri/ /wp-app/index.php?$args ;
    }

    location ~ \.php$ {
            try_files      $uri = 404;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
    }

# Alternatively Pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

    #location ~ \.php$ {
            #try_files $uri =404;
            #fastcgi_split_path_info ^(.+\.php)(/.+)$;
            #fastcgi_pass unix:/var/run/php5-fpm.sock;
            #fastcgi_index index.php;
#                #include fastcgi_params;
    #}

    location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|Zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
            access_log off; log_not_found off; expires max;
    }

    location = /robots.txt { access_log off; log_not_found off; }
    location ~ /\. { deny  all; access_log off; log_not_found off; }
} 

..

Et dans votre fichier index.php, changez le chemin en /wp-app/wp-blog-header.php

<?php
 /**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

 /**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
 define('WP_USE_THEMES', true);

 /** Loads the WordPress Environment and Template */
 require( dirname( __FILE__ ) . '/wp-app/wp-blog-header.php' );

..

De plus, si un certificat SSl est configuré, assurez-vous que l'URL du site et l'URL du site WordPress sont corrects. Il peut être modifié sous WordPress Paramètres généraux ou en plaçant ces deux lignes sur votre fichier wp-config.php, où "example.com" est l'emplacement correct de votre site. Remarque Ce n'est pas nécessairement la meilleure solution, il suffit de coder en dur les valeurs dans le site lui-même. Vous ne pourrez plus les éditer sur la page Paramètres généraux en utilisant cette méthode.

define('WP_HOME','https://example.com');
define('WP_SITEURL','https://example.com');
1
Adriano Monecchi