Cambiar los enlaces permanentes me da errores 404 en nginx

18

EDITAR

Resulta que estaba ladrando el árbol equivocado tratando de editar .htaccess, ya que nginx no lo usa. Lo que aparentemente necesito hacer es editar mi archivo .conf. Antes de leer esto, my_app.conf se veía así:

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

Ahora se ve así, y todavía no funciona:

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

Alguien sabe lo que estoy haciendo mal?

EDICIÓN FINAL

He cambiado mis enlaces permanentes del valor predeterminado a /% postname% /, y ahora los enlaces dentro del panel de administración de WordPress me dan errores 404, no páginas 404 de WordPress, páginas nginx 404. Buscando por qué esto me dice que esto debería estar editando mi archivo .htaccess o diciéndome que WordPress no puede reescribir .htaccess: el archivo .htaccess no existe y WordPress no está dando ningún error cuando cambio enlaces permanentes.

Intenté crear un archivo .htaccess en blanco en mi carpeta de WordPress, dándole 666 permisos, cambiando el usuario y el grupo a www-data y luego cambiando los enlaces permanentes, eso no funcionó. Luego lo cambié a esto antes de cambiar los enlaces permanentes:

# 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

Cuando eso no funcionó, cambié RewriteBasea /wordpress/antes de cambiar los enlaces permanentes de nuevo, todavía nada.

También ingresé al archivo .conf de mi sitio y cambié try_files $uri $uri/ /index.php;a lo siguiente, reiniciando nginx y php5-fpm cada vez;

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

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

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

Estoy ejecutando un servidor doméstico con nginx. ¿Alguna idea sobre lo que está pasando aquí?

ninjachicken1
fuente

Respuestas:

13

Esas son .htaccessreglas de reescritura de Apache , pero usted ha declarado que está en un servidor Nginx. Nginx no usa un .htaccessarchivo de nivel de directorio similar, mucho menos usa el .htaccessarchivo en sí mismo. Necesita editar la configuración del servidor. El Codex tiene una muestra detallada :

# 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
fuente
Gracias, votaría si tuviera reputación. Tengo un pequeño problema para implementar esto en mi archivo .conf, ya que ya se modificó significativamente del valor predeterminado, pero al menos ya no estoy jugando con .htaccess.
ninjachicken1
@s_ha_dum, utilicé esta configuración hasta ayer cuando actualicé a wordpress 4.8 y ahora estoy obteniendo 404s en la estructura personalizada de enlaces permanentes ... intenté depurarlo desde ayer pero nada worx, ¿alguna idea?
Jadeye
Tuve que cambiar la última línea para leer "fastcgi_pass unix: /var/run/php/php7.2-fpm.sock;" para trabajar en Ubuntu 18.04 pero funciona y salvó mi cordura
Rob
18

Estoy usando WordPress multisitio con configuración de enlace permanente personalizada: /% category% /% postname% /

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

En el servidor {

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

Si su raíz wordpress no es el webroot sino http://domain.com/wordpress/ :

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

Si está utilizando wordpress antiguo con blogs.dir, agregue: location ^ ~ /blogs.dir {internal; alias /var/www/wordpress/wp-content/blogs.dir; acceso_log desactivado; log_not_found off; expira max; }

Verifique la configuración de nginx: sudo nginx -t

Recargar nginx: sudo service nginx reload

También intente cambiar la configuración del enlace permanente.

Domi
fuente
44
¡Esta es la mejor respuesta para cualquier persona que quiera mover manualmente una instalación de WordPress a un subdirectorio con un nuevo nombre de dominio! ¡MUCHAS GRACIAS! Esta debería ser la respuesta aceptada.
specialk1st
1
La ruta: / etc / nginx / site-available / debería leer: / etc / nginx / sites-available /
Grant
6

Tuve que agregar este fragmento de código tanto a la /sites-available/your-settings-filey /sites-enabled/your-settings-file:

server {
[...]

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

[...]
}

Me está funcionando ahora.

Angelo Reale
fuente
1
Esta es la respuesta simple que estaba buscando, gracias
ThEBiShOp
1
Esto funcionó! ¿Podría explicar qué hace? (especialmente la "última" parte ...)
Sidd
1

Tuve que establecer la ruta raíz al directorio instalado de wordpressś: root / var / www / html / wp;

No me gusta porque tengo más aplicaciones instaladas en esta máquina, pero crear más hosts virtuales debería ser suficiente.

Mendas
fuente