wp-json/ returnează 404, dar wp-json/wp/v2/ funcționează corect pe serverul meu nginx

24 ian. 2017, 07:40:10
Vizualizări: 35.4K
Voturi: 3

Când accesez site-ul meu WordPress ca www.example.com/wp-json/ primesc această eroare 404.

{"code":"rest_no_route","message":"No route was found matching the URL and request method","data":{"status":404}}

Dar API-ul REST returnează obiectul json corect dacă folosesc URL-ul www.example.com/wp-json/wp/v2/.

Permalink-ul meu este setat ca /%year%/%monthnum%/%postname%/, și aici este o parte din setările mele de configurare nginx:

server {

    root /var/www/html;
    index index.php index.html index.htm;

    location / {
      try_files $uri $uri/ /index.php$is_args$args;
    }

    # alte directive location legate de php, cache, etc.

}

Am căutat pe Internet și majoritatea problemelor par să fie cauzate de setarea incorectă a permalink-urilor și .htaccess (Apache), dar rareori se menționează cazul legat de nginx. Aveți vreo idee ce cauzează acest lucru și cum poate fi rezolvat?

Actualizare

Dacă rulez curl -i www.example.com/wp-json, iată ce primesc:

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 route was found matching the URL and request method","data":{"status":404}}

Ultima Actualizare (7 Mar 2017)

Odată cu lansarea WordPress 4.7.3, acest bug a fost remediat. Soluția temporară unset ($_SERVER['PATH_INFO']); nu mai este necesară.

7
Comentarii

Ce te aștepți să găsești la wp-json/?

Nathan Powell Nathan Powell
24 ian. 2017 08:42:12

Folosești un plugin pentru a accesa API-ul?

Nathan Powell Nathan Powell
24 ian. 2017 08:45:59

Când accesez wp-json/ mă așteptam la același rezultat ca la wp-json/wp/v2, acesta a fost comportamentul corect pe alt server al meu care rulează Apache. Nu, nu am un plugin pentru REST. WordPress-ul meu este versiunea 4.7, am crezut că nu mai este nevoie de un plugin pentru REST API.

hcheung hcheung
24 ian. 2017 09:51:09

Nu mai este necesar să ai un plugin, dar se pare că punctele finale ale nucleului sunt versiunea v2. Poate nu este vorba despre Apache vs nginx, ci ai folosit un plugin anterior?

Nathan Powell Nathan Powell
24 ian. 2017 10:02:14

Nu, nu am folosit niciodată un plugin, așa cum am menționat în mesajul meu anterior, că pentru aceeași configurare WordPress care rulează pe un server Apache funcționează fără un plugin.

hcheung hcheung
24 ian. 2017 13:26:19

Ai reușit să rezolvi? Am aceeași problemă

Snowball Snowball
13 feb. 2017 08:36:14

Nu, nu am primit încă niciun comentariu relevant.

hcheung hcheung
13 feb. 2017 14:10:52
Arată celelalte 2 comentarii
Toate răspunsurile la întrebare 4
1

Am întâmpinat aceeași problemă pe o instalație WordPress goală, doar cu nginx (fără Apache), versiunea 4.7.2.

URL-urile de bază /wp-json/ și index.php?rest_route=/ afișau eroarea rest_no_route 404, însă toate rutele /wp-json/wp/v2/ funcționau perfect.

Problema s-a dovedit a fi legată de variabila PATH_INFO trimisă de nginx, pe care nucleul WordPress încearcă să o folosească pentru a construi URL-ul în mod incorect, chiar dacă este setată la orice valoare, inclusiv un șir gol.

Este nevoie de mai multe investigații, dar am reușit să rezolv prin adăugarea unei condiții pentru aceste pagini specifice folosind REQUEST_URI, făcând astfel:

unset($_SERVER['PATH_INFO']);
17 feb. 2017 01:18:35
Comentarii

Ah, mulțumesc @user113522, acum înțeleg de ce s-a întâmplat asta. WordPress se bazează pe .htaccess pentru a gestiona redirectarea, dar în cazul Nginx, Nginx nu folosește .htaccess. Când WordPress nu găsește fișierul .htaccess, apelează la PATH_INFO care adaugă un index.php suplimentar în URL. Soluția ta de a adăuga unset($_SERVER['PATH_INFO']); funcționează, dar cred că e mai bine să configurezi o redirectare la nivel de directivă location în Nginx. O să testez când voi avea timp și voi posta aici rezultatele.

hcheung hcheung
22 feb. 2017 08:19:52
2

Ar putea fi vorba despre https://core.trac.wordpress.org/ticket/39432

Simptomele par foarte asemănătoare și la momentul scrierii nu a fost lansată versiunea 4.7.3. Aplicarea patch-ului manual a rezolvat problema pe configurația mea nginx.

20 feb. 2017 21:58:17
Comentarii

Mulțumesc pentru link. Aceasta a rezolvat problema, dar din moment ce implică modificarea codului în /wp-includes, aș prefera să nu o schimb în acest fel. Momentan sunt pe versiunea 4.7.2, sper ca această problemă va fi remediată în versiunea viitoare 4.7.3. Între timp, voi urma instrucțiunile lui @user113522 prin anularea variabilei $_SERVER['PATH_INFO'].

hcheung hcheung
22 feb. 2017 16:59:32

Modificarea nucleului specific pentru acest patch nu face cu adevărat o diferență, deoarece actualizarea care suprascrie tot va conține același lucru.

lkraav lkraav
22 feb. 2017 20:30:45
0

Pentru mine, actualizarea legăturilor permanente la ceva mai special decât prima opțiune a funcționat.

30 mai 2017 13:16:41
0

A funcționat pentru mine cu configurația propusă de nginx de la WordPress. Adaugă asta în nginx.conf

location /wp-json/ { # Rezolvă problema de 404 din WP Gutenberg
  try_files $uri $uri/ /index.php;
} 

și schimbă setările 'Permalinks' la 'Nume postare'

aceasta ar trebui să rezolve problema cu /wp-json. https://wordpress.org/support/article/nginx/

Am configurat un site de rețea cu instrucțiunile date și totul a funcționat bine. Merită încercat!

De asemenea, site-urile https trebuie să aibă permalink-uri corecte, verifică și asta!

5 dec. 2020 13:55:22