Cambiar los enlaces permanentes me da errores 404 en nginx

14

EDITAR

Resulta que estaba ladrando el árbol equivocado al intentar 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 tenía este aspecto:

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 aún 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?

EDITAR 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 de WordPress 404, nginx 404 páginas. Viendo por qué se me dice que esto debería ser editar mi archivo .htaccess o decirme que WordPress no puede volver a escribir .htaccess: el archivo .htaccess no existe y WordPress no da ningún error cuando cambio los enlaces permanentes.

He intentado 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, que no funcionaron. 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é de RewriteBase a /wordpress/ antes de volver a cambiar los enlaces permanentes, aún 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í?

    
pregunta ninjachicken1 21.05.2015 - 18:30

4 respuestas

11

Esas son reglas de reescritura de Apache .htaccess , pero usted ha declarado que está en un servidor Nginx. Nginx no usa un archivo de nivel de directorio similar a .htaccess , y mucho menos utiliza el archivo .htaccess en sí mismo. Debe 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;
}
    
respondido por el s_ha_dum 21.05.2015 - 18:48
15

Estoy usando wordpress multisite con una configuración personalizada de enlace permanente: /% category% /% postname% /

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

En el servidor {

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

Si su wordpress raíz no es webroot sino enlace :

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

Si está usando wordpress antiguo con blogs.dir, agregue:     ubicación ^ ~ /blogs.dir {         interno;         alias /var/www/wordpress/wp-content/blogs.dir;         access_log desactivado; log_not_found off; caduca max;     }

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

Recargar nginx: servicio de sudo nginx recargar

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

    
respondido por el Domi 30.11.2016 - 19:08
5

Tenía que agregar este fragmento de código tanto a /sites-available/your-settings-file como a /sites-enabled/your-settings-file :

server {
[...]

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

[...]
}

Está funcionando para mí ahora.

    
respondido por el Angelo Reale 06.04.2017 - 07:38
0

Tuve que establecer la ruta de acceso 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.

    
respondido por el Mendas 07.08.2018 - 16:07

Lea otras preguntas en las etiquetas