La modifica dei permalink mi dà errori 404 su nginx

21 mag 2015, 19:30:36
Visualizzazioni: 51.5K
Voti: 25

MODIFICA

Si è scoperto che stavo seguendo la strada sbagliata cercando di modificare .htaccess, poiché nginx non lo utilizza. Quello che apparentemente devo fare è modificare il mio file .conf. Prima di leggere questo, il mio my_app.conf era così:

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

    # Questo blocco location corrisponde a qualsiasi cosa che termina in .php e la invia al
    # nostro socket PHP-FPM, definito nel blocco upstream sopra.
    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;
    }

    # Questo blocco location è usato per visualizzare le statistiche PHP-FPM
    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;
    }

    # Questo blocco location è usato per visualizzare le statistiche nginx
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

Ora appare così, ma ancora non funziona:

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

    # Decommentare una delle righe sottostanti per il plugin di caching appropriato (se utilizzato).
    #include global/wordpress-wp-super-cache.conf;
    #include global/wordpress-w3-total-cache.conf;

    # Questo blocco location corrisponde a qualsiasi cosa che termina in .php e la invia al
    # nostro socket PHP-FPM, definito nel blocco upstream sopra.
    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;
    }

    # Questo blocco location è usato per visualizzare le statistiche PHP-FPM
    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;
    }

    # Questo blocco location è usato per visualizzare le statistiche nginx
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

Qualcuno sa cosa sto sbagliando?

FINE MODIFICA

Ho cambiato i miei permalink dal default a /%postname%/, e ora i link all'interno del pannello di amministrazione di WordPress mi danno errori 404 - Non pagine 404 di WordPress, ma pagine 404 di nginx. Cercando il motivo mi è stato detto che questo dovrebbe modificare il mio file .htaccess o indicarmi che WordPress non può riscrivere .htaccess - il file .htaccess è inesistente e WordPress non dà errori quando cambio i permalink.

Ho provato a creare un file .htaccess vuoto nella mia cartella wordpress, dandogli permessi 666, cambiando l'utente e il gruppo in www-data e poi cambiando i permalink - non ha funzionato. L'ho poi cambiato in questo modo prima di modificare i permalink:

# 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

Quando non ha funzionato, ho cambiato RewriteBase in /wordpress/ prima di cambiare di nuovo i permalink - ancora niente.

Ho anche modificato il file .conf del mio sito e cambiato try_files $uri $uri/ /index.php; nelle seguenti versioni, riavviando nginx e php5-fpm ogni volta:

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

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

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

Sto gestendo un server domestico con nginx. Qualche idea su cosa sta succedendo qui?

0
Tutte le risposte alla domanda 7
4
32

Sto utilizzando WordPress multisite con l'impostazione dei permalink personalizzati: /%category%/%postname%/

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

All'interno del blocco server{

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

Se la root di WordPress non è la webroot ma http://domain.com/wordpress/:

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

Se stai utilizzando una vecchia versione di WordPress con blogs.dir, aggiungi: location ^~ /blogs.dir { internal; alias /var/www/wordpress/wp-content/blogs.dir; access_log off; log_not_found off; expires max; }

Verifica la configurazione di nginx: sudo nginx -t

Ricarica nginx: sudo service nginx reload

Prova anche a modificare le impostazioni dei permalink.

30 nov 2016 20:08:16
Commenti

Questa è la risposta migliore per chiunque voglia spostare manualmente un'installazione di WordPress in una sottodirectory sotto un nuovo nome di dominio! GRAZIE MILLE! Questa dovrebbe essere la risposta accettata.

specialk1st specialk1st
24 gen 2017 15:25:04

Il percorso: /etc/nginx/site-available/ dovrebbe essere: /etc/nginx/sites-available/

Grant Grant
20 feb 2018 12:14:01

La seconda opzione funziona per me poiché il mio sito era in una sottodirectory

Arunendra Arunendra
19 ott 2020 05:37:08

Mi sono iscritto a questo scambio solo per poterti ringraziare. Sia lodato, uomo saggio! Stavo per iniziare a strapparmi i capelli quando questa soluzione mi ha salvato. Contesto: ho copiato il mio database WP da un host Ubuntu a un altro e sto usando Nginx per servire WP.

JovanToroman JovanToroman
26 ott 2023 18:22:02
3
18

Queste sono regole di riscrittura Apache .htaccess, ma hai specificato di essere su un server Nginx. Nginx non utilizza un file a livello di directory simile a .htaccess, tanto meno utilizza il file .htaccess stesso. Devi modificare la configurazione del server. Il Codex ha un esempio dettagliato:

# Regole per WordPress single blog.
# Progettate per essere incluse in qualsiasi blocco server {}.

# Questo ordine potrebbe sembrare strano - è un tentativo di fare match per ultimo se falliscono le regole sottostanti.
# http://wiki.nginx.org/HttpCoreModule
location / {
    try_files $uri $uri/ /index.php?$args;
}

# Aggiunge slash finale alle richieste */wp-admin.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Direttive per inviare header expires e disattivare il logging degli errori 404.
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;
}

# Scommenta una delle righe sottostanti per il plugin di caching appropriato (se utilizzato).
#include global/wordpress-wp-super-cache.conf;
#include global/wordpress-w3-total-cache.conf;

# Passa tutti i file .php a un server php-fpm/php-fcgi.
location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }
    # Questa è una soluzione robusta per il problema di sicurezza path info e funziona con "cgi.fix_pathinfo = 1" in /etc/php.ini (default)

    include fastcgi.conf;
    fastcgi_index index.php;
#   fastcgi_intercept_errors on;
    fastcgi_pass php;
}
21 mag 2015 19:48:16
Commenti

Grazie, voterei questa soluzione se avessi abbastanza reputazione. Sto avendo qualche difficoltà a implementarla nel mio file .conf visto che è già stato modificato significativamente rispetto a quello predefinito, ma almeno non devo più pasticciare con il file .htaccess.

ninjachicken1 ninjachicken1
21 mag 2015 22:32:50

@s_ha_dum, ho usato questa configurazione fino a ieri quando ho aggiornato a WordPress 4.8 e ora ottengo errori 404 sui permalink con struttura personalizzata... ho provato a debuggarli da ieri ma nulla funziona, hai qualche idea??

Jadeye Jadeye
4 lug 2017 17:32:09

Ho dovuto modificare l'ultima riga in "fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;" per farla funzionare su Ubuntu 18.04 ma ora funziona e mi ha salvato la sanità mentale

Rob Rob
17 dic 2018 05:24:27
6
12

Ho dovuto aggiungere questo frammento di codice sia nel file /sites-available/tuo-file-di-configurazione che in /sites-enabled/tuo-file-di-configurazione:

server {
[...]

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

[...]
}

Ora funziona correttamente nel mio caso.

6 apr 2017 08:38:16
Commenti

Questa è la semplice risposta che stavo cercando, grazie

ThEBiShOp ThEBiShOp
28 giu 2017 22:15:47

Ha funzionato! Potresti spiegarmi cosa fa? (soprattutto la parte "last"...)

Sidd Sidd
12 ago 2018 21:50:25

Questo codice funziona ancora!

Julio de Leon Julio de Leon
16 set 2020 20:34:00

I file in sites-enabled/ sono collegati simbolicamente a quelli in sites-available/, quindi in pratica stai modificando il file all'interno di sites-available/ e le modifiche si rifletteranno automaticamente nell'altra cartella. Solo una precisazione.

RP McMurphy RP McMurphy
15 gen 2021 20:39:02

Posso confermare che funziona ancora perfettamente!

terryeah terryeah
2 apr 2022 05:11:34

Questa è la risposta corretta. Grazie mille. Qualcuno potrebbe spiegare qual era il problema e come questa soluzione lo ha risolto?

music music
4 mar 2023 11:46:24
Mostra i restanti 1 commenti
0

Ho dovuto impostare il percorso root alla directory di installazione di WordPress: root /var/www/html/wp;

Non mi piace perché ho più applicazioni installate su questa macchina ma creare più host virtuali dovrebbe essere sufficiente.

7 ago 2018 17:07:42
0

Passo 1. Modifica /etc/nginx/site-available/example.com

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

Passo 2. Accedi al server Passo 3. Esegui il seguente codice per creare un symlink al tuo dominio

ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

Passo 4. Testa la configurazione

sudo nginx -t

Passo 5. Riavvia il server Nginx

sudo systemctl restart nginx

Passo 6. Salva i permalink dal pannello di amministrazione di WordPress ***** Buona navigazione ****

Maggiori dettagli http://toihid.com/wordpress-permalink-in-nginx-server/

19 mag 2020 11:52:56
0

La risposta di @Angelo ha risolto il problema per me. Vorrei votarla positivamente ma non ho abbastanza reputazione, quindi posto una risposta.

Solo per chiarezza, la seguente configurazione

server {
        server_name xxx.xxxx.com;
        
        root /var/www/wordpress;

        listen 80;
        listen [::]:80;

        index index.php;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        }
}

è diventata

server {
        server_name xxx.xxxx.com;
        
        root /var/www/wordpress;

        listen 80;
        listen [::]:80;

        index index.php;

        location / {
                try_files $uri $uri/ =404;
        }

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

        location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        }
}

Notare l'aggiunta di


        if (!-e $request_filename) {
                rewrite ^.*$ /index.php last;
        }
23 ago 2023 12:36:37
0

Ecco una soluzione che ha funzionato per me su un server piuttosto nuovo. Il server non aveva mai eseguito Apache. Quando ho modificato i permalink, ricevevo un errore 404 su tutte le pagine tranne la home. Ho attivato Apache invece di Nginx, poi ho CAMBIATO le impostazioni dei permalink e salvato. Successivamente, ho probabilmente modificato nuovamente le impostazioni per ottenere ciò che volevo e ho salvato. Questo creerà un file .htaccess. Poi ho riattivato Nginx e tutto ha funzionato.

Nginx ha un sistema per leggere il file .htaccess e configurarsi di conseguenza. Ma finché non esiste un file .htaccess, non può farlo.

Questo è stato testato su Plesk, WordPress 6.5 e PHP 8.2 su Linux.

16 apr 2024 00:11:04