Changer de permaliens me donne 404 erreurs sur nginx

14

EDIT

Il s’est avéré que j’écrouvais le mauvais arbre en essayant de modifier .htaccess, car nginx ne l’utilise pas. Ce que j’ai apparemment besoin de faire, c’est de modifier mon fichier .conf. Avant de lire ceci, mon_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, cela ressemble à ceci et cela 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?

END EDIT

J'ai changé mes liens permanents par défaut en /% postname% /, et maintenant les liens dans le panneau d'administration de WordPress m'indiquent des erreurs 404 - Pas WordPress 404 pages, nginx 404 pages. En cherchant pourquoi cela m'est dit que cela devrait être éditer mon fichier .htaccess ou me dire que WordPress ne peut pas réécrire .htaccess - le fichier .htaccess est inexistant, et WordPress ne génère aucune erreur lorsque je change de permalien.

J'ai essayé de créer un fichier .htaccess vierge dans mon dossier wordpress, de lui attribuer des autorisations, de changer 666 l'utilisateur et le groupe en www-data, puis de changer les permaliens - cela ne fonctionnait pas. 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

Lorsque cela ne fonctionnait pas, j'ai changé RewriteBase en /wordpress/ avant de changer à nouveau de liens permanents - toujours rien.

Je suis également allé dans le fichier .conf de mon site et a modifié try_files $uri $uri/ /index.php; comme suit, 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'utilise un serveur domestique avec nginx. Des idées sur ce qui se passe ici?

    
posée ninjachicken1 21.05.2015 - 18:30

4 réponses

11

Ce sont des règles Apache .htaccess de réécriture, mais vous avez indiqué que vous êtes sur un serveur Nginx. Nginx n'utilise pas de fichier au niveau du répertoire .htaccess , mais utilise encore moins le fichier .htaccess . Vous devez modifier la configuration du serveur elle-même. Le codex contient un exemple 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;
}
    
réponse donnée s_ha_dum 21.05.2015 - 18:48
15

J'utilise wordpress multisite avec le 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 wordpress racine n'est pas la racine Web, mais plutôt enlace :

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

Si vous utilisez old wordpress avec blogs.dir, ajoutez:     emplacement ^ ~ /blogs.dir {         interne;         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.

    
réponse donnée Domi 30.11.2016 - 19:08
5

Il a fallu ajouter ce morceau de code aux /sites-available/your-settings-file et /sites-enabled/your-settings-file :

server {
[...]

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

[...]
}

Cela fonctionne pour moi maintenant.

    
réponse donnée Angelo Reale 06.04.2017 - 07:38
0

Je devais définir le chemin racine du répertoire installé de wordpress: root / var / www / html / wp;

Je n'aime pas cela parce que j'ai plus d'applications installées sur cette machine, mais la création de plus d'hôtes virtuels devrait suffire.

    
réponse donnée Mendas 07.08.2018 - 16:07

Lire d'autres questions sur les étiquettes