La modifica dei permalink mi dà errori 404 su nginx
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?

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.

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.

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

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

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.

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

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.

@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??

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.

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

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.

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/

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

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.
