La modifica dei permalink mi dà 404 errori su nginx


18

MODIFICARE

Si scopre che stavo abbaiando l'albero sbagliato cercando di modificare .htaccess, poiché nginx non lo usa. Ciò che apparentemente devo fare è modificare il mio file .conf. Prima di leggere questo, my_app.conf assomigliava a questo:

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

Ora sembra così e non funziona ancora:

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

Qualcuno sa cosa sto facendo di sbagliato?

MODIFICA FINE

Ho cambiato i miei permalink dal valore predefinito a /% postname% /, e ora i collegamenti all'interno del pannello di amministrazione di WordPress mi danno 404 errori - Non WordPress 404 pagine, nginx 404 pagine. Cercando perché questo mi ha detto che questo dovrebbe essere la modifica del mio file .htaccess o che mi dice che WordPress non può riscrivere .htaccess - il file .htaccess è inesistente e WordPress non sta dando alcun errore quando cambio permalink.

Ho provato a creare un file .htaccess vuoto nella mia cartella wordpress, dandogli 666 autorizzazioni, cambiando l'utente e il gruppo in www-data e poi cambiando i permalink - che non funzionavano. L'ho quindi cambiato in questo prima di cambiare 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, sono passato RewriteBasea /wordpress/prima di cambiare di nuovo i permalink - ancora niente.

Sono anche andato nel file .conf del mio sito e sono cambiato try_files $uri $uri/ /index.php;nel seguente, 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 eseguendo un server di casa con nginx. Qualche idea su cosa sta succedendo qui?

Risposte:


13

Queste sono le .htaccessregole di riscrittura di Apache , ma hai dichiarato di essere su un server Nginx. Nginx non utilizza un .htaccessfile a livello di directory simile, tanto meno utilizza il .htaccessfile stesso. È necessario modificare la configurazione del server stesso. Il Codice ha un esempio di dettaglio :

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

Grazie, voterei questo se avessi la reputazione. Sto riscontrando qualche problema nell'implementazione di questo nel mio file .conf visto che era già cambiato in modo significativo rispetto all'impostazione predefinita, ma almeno non sto più armeggiando con .htaccess.
ninjachicken1

@s_ha_dum, ho usato la tua configurazione fino a ieri quando ho aggiornato a wordpress 4.8 e ora sto ottenendo 404s sulla struttura personalizzata di permalink .... ho provato a eseguire il debug da ieri ma niente worx, qualche idea ??
Jadeye,

Ho dovuto cambiare l'ultima riga per leggere "fastcgi_pass unix: /var/run/php/php7.2-fpm.sock;" lavorare su Ubuntu 18.04 ma funziona e ha salvato la mia sanità mentale
Rob

18

Sto usando wordpress multisito con impostazione permalink personalizzata: /% categoria% /% postname% /

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

Sul server {

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

Se il tuo wordpress di root non è il webroot ma http://domain.com/wordpress/ :

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

Se stai usando il vecchio wordpress con blogs.dir, aggiungi: location ^ ~ /blogs.dir {internal; alias /var/www/wordpress/wp-content/blogs.dir; access_log off; log_not_found off; scade al massimo; }

Controlla la configurazione di nginx: sudo nginx -t

Ricarica nginx: sudo service nginx ricaricare

Prova anche a modificare le impostazioni del permalink.


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

1
Il percorso: / etc / nginx / site-available / dovrebbe leggere: / etc / nginx / sites-available /
Concedi il

6

Ho dovuto aggiungere questo pezzo di codice sia a /sites-available/your-settings-fileche a /sites-enabled/your-settings-file:

server {
[...]

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

[...]
}

Ora funziona per me.


1
Questa è la semplice risposta che stavo cercando, grazie
ThEBiShOp

1
Questo ha funzionato! Potresti spiegare cosa fa? (specialmente la parte "ultima" ...)
Sidd,

1

Ho dovuto impostare il percorso di root nella directory installata di wordpress: root / var / www / html / wp;

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.