wp-json/ devuelve 404, pero wp-json/wp/v2/ funciona bien en mi servidor nginx
Cuando accedo a mi sitio WordPress como www.example.com/wp-json/
obtengo este error 404.
`{"code":"rest_no_route","message":"No se encontró ninguna ruta que coincida con la URL y el método de solicitud","data":{"status":404}}`
Pero la API REST devuelve el objeto json correcto si uso la URL www.example.com/wp-json/wp/v2/
.
Mi permalink está configurado como /%year%/%monthnum%/%postname%/
, y aquí está parte de mi configuración de nginx:
server {
root /var/www/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
# otras directivas de ubicación relacionadas con php, caché, etc.
}
Busqué en Internet y la mayoría de los problemas parecen ser causados por una configuración incorrecta de los enlaces permanentes y .htaccess (Apache), pero rara vez se menciona el caso relacionado con nginx. ¿Alguna idea de qué causa esto y cómo solucionarlo?
Actualización
Si ejecuto curl -i www.example.com/wp-json
, esto es lo que obtengo:
HTTP/1.1 404 Not Found
Server: nginx
Date: Sun, 29 Jan 2017 11:58:21 GMT
Content-Type: application/json; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-Robots-Tag: noindex
Link: <https://example.com/wp-json/>; rel="https://api.w.org/"
X-Content-Type-Options: nosniff
Access-Control-Expose-Headers: X-WP-Total, X-WP-TotalPages
Access-Control-Allow-Headers: Authorization, Content-Type
{"code":"rest_no_route","message":"No se encontró ninguna ruta que coincida con la URL y el método de solicitud","data":{"status":404}}
Última actualización (7 Mar 2017)
Con el lanzamiento de WordPress 4.7.3, este error ha sido corregido. Ya no se necesita la solución temporal unset ($_SERVER['PATH_INFO']);
.
Acabo de encontrarme con el mismo problema en una instalación limpia de WordPress 4.7.2 solo con nginx (sin Apache).
Las URL base /wp-json/
y index.php?rest_route=/
mostraban rest_no_route 404
, pero todas las rutas /wp-json/wp/v2/
funcionaban correctamente.
El problema resultó estar relacionado con la variable PATH_INFO
que pasa nginx y que WordPress core intenta usar incorrectamente para construir la URL, incluso si está configurada como una cadena vacía.
Requiere más investigación, pero logré solucionarlo agregando una condición para esas páginas específicas mediante REQUEST_URI
, haciendo esto:
unset($_SERVER['PATH_INFO']);

Ah, gracias @user113522, ahora entiendo por qué sucedió esto. WordPress realmente depende de .htaccess para manejar las redirecciones, pero en el caso de Nginx, Nginx no usa .htaccess. Cuando WordPress no puede encontrar el .htaccess, recurre a usar PATH_INFO lo que agrega un index.php adicional en la URL. Tu solución de agregar unset($_SERVER['PATH_INFO']);
funciona, pero creo que es mejor configurar una redirección en la directiva de ubicación de nginx. Lo probaré cuando tenga tiempo y lo publicaré aquí más tarde.

¿Podría tratarse de https://core.trac.wordpress.org/ticket/39432?
Los síntomas parecen muy similares y al momento de escribir esto no se ha lanzado como parte de la versión 4.7.3. Aplicar el parche manualmente resolvió el problema en mi configuración de nginx.

Gracias por el enlace. Esto solucionó el problema, pero como implica modificar el código en /wp-includes, prefiero no cambiarlo de esta manera. Actualmente estoy en la versión 4.7.2, espero que esto se solucione en la próxima versión 4.7.3. Mientras tanto, seguiré las instrucciones de @user113522 eliminando $_SERVER['PATH_INFO']
.

Funcionó para mí con la configuración propuesta de nginx de WordPress.
Añade esto a tu nginx.conf:
location /wp-json/ { # Resuelve el problema 404 de WP Gutenberg
try_files $uri $uri/ /index.php;
}
y cambia la configuración de 'Enlaces permanentes' a 'Nombre de entrada'.
Esto debería resolver el problema con /wp-json
.
https://wordpress.org/support/article/nginx/
Configuré un sitio de red con las instrucciones proporcionadas y todo pareció funcionar bien. ¡Vale la pena intentarlo!
Además, los sitios HTTPS deben tener los enlaces permanentes correctos, ¡asegúrate de comprobarlo también!
