Changer les permaliens me donne 404 erreurs sur nginx

18

ÉDITER

Il s'avère que j'aboyais le mauvais arbre en essayant d'éditer .htaccess, car nginx ne l'utilise pas. Apparemment, je dois modifier mon fichier .conf. Avant de lire ceci, my_app.conf ressemblait à ceci:

upstream backend {
    server unix:/u/apps/my_app/tmp/php.sock;
}

server {

    listen 80 default;
    root /u/apps/my_app/www;
    index index.php;

    access_log /u/apps/my_app/logs/access.log;
    error_log /u/apps/my_app/logs/error.log;

    location / {
        try_files $uri $uri/ /index.php;
    }

    # This location block matches anything ending in .php and sends it to
    # our PHP-FPM socket, defined in the upstream block above.
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass backend;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /u/apps/my_app/www$fastcgi_script_name;
        include fastcgi_params;
    }

    # This location block is used to view PHP-FPM stats
    location ~ ^/(php_status|php_ping)$ {
        fastcgi_pass backend;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
        include fastcgi_params;
        allow 127.0.0.1;
        deny all;
    }

    # This location block is used to view nginx stats
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

Maintenant, ça ressemble à ça, et ça ne fonctionne toujours pas:

upstream backend {
    server unix:/u/apps/my_app/tmp/php.sock;
}

server {

    listen 80 default;
    root /u/apps/my_app/www;
    index index.php;

    access_log /u/apps/my_app/logs/access.log;
    error_log /u/apps/my_app/logs/error.log;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location /wordpress/ {
        try_files $uri $uri/ /index.php?$args;
    }

    rewrite /wp-admin$ $scheme://$host$uri/ permanent;

    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;
    }

    # Uncomment one of the lines below for the appropriate caching plugin (if used).
    #include global/wordpress-wp-super-cache.conf;
    #include global/wordpress-w3-total-cache.conf;

    # This location block matches anything ending in .php and sends it to
    # our PHP-FPM socket, defined in the upstream block above.
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass backend;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /u/apps/my_app/www$fastcgi_script_name;
        include fastcgi_params;
    }

    # This location block is used to view PHP-FPM stats
    location ~ ^/(php_status|php_ping)$ {
        fastcgi_pass backend;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
        include fastcgi_params;
        allow 127.0.0.1;
        deny all;
    }

    # This location block is used to view nginx stats
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

Quelqu'un sait ce que je fais mal?

FIN DE LA MODIFICATION

J'ai changé mes permaliens par défaut en /% postname% /, et maintenant les liens dans le panneau d'administration de WordPress me donnent 404 erreurs - Pas WordPress 404 pages, nginx 404 pages. En cherchant pourquoi cela me dit que cela devrait modifier mon fichier .htaccess ou me dire que WordPress ne peut pas réécrire .htaccess - le fichier .htaccess est inexistant, et WordPress ne donne aucune erreur lorsque je change de permaliens.

J'ai essayé de créer un fichier .htaccess vierge dans mon dossier wordpress, en lui accordant 666 autorisations, en changeant l'utilisateur et le groupe en www-data puis en changeant les permaliens - cela n'a pas fonctionné. Je l'ai ensuite changé en ceci avant de changer les permaliens:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Quand cela n'a pas fonctionné, je suis passé RewriteBaseà /wordpress/avant de changer à nouveau de permaliens - toujours rien.

Je suis également allé dans le fichier .conf de mon site et j'ai changé try_files $uri $uri/ /index.php;pour le suivant, en redémarrant nginx et php5-fpm à chaque fois;

try_files $uri $uri/ /index.php?$query_string;

try_files $uri $uri/ /index.php?q=$request_uri;

try_files $uri $uri/ /index.php?$args;

J'exécute un serveur domestique avec nginx. Des idées sur ce qui se passe ici?

ninjachicken1
la source

Réponses:

13

Ce sont des .htaccessrègles de réécriture Apache , mais vous avez déclaré que vous êtes sur un serveur Nginx. Nginx n'utilise pas de .htaccessfichier de niveau répertoire, et encore moins le .htaccessfichier lui-même. Vous devez modifier la configuration du serveur lui-même. Le Codex a un échantillon détaillé :

# WordPress single blog rules.
# Designed to be included in any server {} block.

# This order might seem weird - this is attempted to match last if rules below fail.
# http://wiki.nginx.org/HttpCoreModule
location / {
    try_files $uri $uri/ /index.php?$args;
}

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Directives to send expires headers and turn off 404 error logging.
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;
}

# Uncomment one of the lines below for the appropriate caching plugin (if used).
#include global/wordpress-wp-super-cache.conf;
#include global/wordpress-w3-total-cache.conf;

# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }
    # This is a robust solution for path info security issue and works with "cgi.fix_pathinfo = 1" in /etc/php.ini (default)

    include fastcgi.conf;
    fastcgi_index index.php;
#   fastcgi_intercept_errors on;
    fastcgi_pass php;
}
s_ha_dum
la source
Merci, je voterais pour si j'avais la réputation. J'ai un peu de mal à l'implémenter dans mon fichier .conf car il a déjà été considérablement modifié par rapport à la valeur par défaut, mais au moins je ne joue plus avec .htaccess.
ninjachicken1
@s_ha_dum, j'ai utilisé la configuration de thies jusqu'à hier quand j'ai mis à jour vers wordpress 4.8 et maintenant j'obtiens 404s sur la structure personnalisée de permaliens .... a essayé de le déboguer depuis hier mais rien de grave, aucune idée ??
Jadeye
J'ai dû changer la dernière ligne pour lire "fastcgi_pass unix: /var/run/php/php7.2-fpm.sock;" de travailler sur Ubuntu 18.04 mais cela fonctionne et a sauvé ma raison
Rob
18

J'utilise wordpress multisite avec un paramètre de permalien personnalisé: /% category% /% postname% /

/etc/nginx/site-available/domain.conf

Sur le serveur {

location / {
    try_files $uri $uri/ /index.php?q=$uri$args;
}

Si votre root wordpress n'est pas le webroot mais http://domain.com/wordpress/ :

location /wordpress/ {
    try_files $uri $uri/ /wordpress/index.php?q=$uri$args;
}

Si vous utilisez l'ancien wordpress avec blogs.dir, ajoutez: location ^ ~ /blogs.dir {internal; alias /var/www/wordpress/wp-content/blogs.dir; access_log off; log_not_found off; expire max; }

Vérifiez la configuration de nginx: sudo nginx -t

Recharger nginx: sudo service nginx reload

Essayez également de modifier les paramètres de permalien.

Domi
la source
4
C'est la meilleure réponse pour quiconque souhaite déplacer manuellement une installation WordPress vers un sous-répertoire sous un nouveau nom de domaine! MERCI BEAUCOUP! Ce devrait être la réponse acceptée.
specialk1st
1
Le chemin: / etc / nginx / site-available / devrait se lire: / etc / nginx / sites-available /
Accordez le
6

J'ai dû ajouter ce morceau de code à la fois à /sites-available/your-settings-fileet /sites-enabled/your-settings-file:

server {
[...]

if (!-e $request_filename) {
    rewrite ^.*$ /index.php last;
}

[...]
}

Ça marche pour moi maintenant.

Angelo Reale
la source
1
Ceci est la réponse simple que je cherchais, merci
ThEBiShOp
1
Ça a marché! Pourriez-vous expliquer ce qu'il fait? (surtout la "dernière" partie ...)
Sidd
1

J'ai dû définir le chemin racine vers le répertoire installé de wordpress: root / var / www / html / wp;

Je ne l'aime pas car j'ai plus d'applications installées sur cette machine mais la création de plus d'hôtes virtuels devrait suffire.

Mendas
la source