Dlaczego serwer odpowiada 405, jaki nagłówek Allow musi wysłać i jak to naprawić we Flask, Express i Next.js. Zbuduj poprawną odpowiedź 405 dla własnej trasy.
405 Method Not Allowed oznacza, że URL istnieje, ale nie akceptuje użytej metody HTTP, na przykład POST wysłanego do trasy obsługującej tylko GET. Serwer musi wymienić akceptowane metody w nagłówku Allow. Wyślij jedną z nich albo dodaj na serwerze handler dla swojej metody.
405 w porównaniu z sąsiednimi kodami
Status
Znaczenie
Typowa poprawka
405 Method Not Allowed
Zasób istnieje; ta metoda nie jest dla niego akceptowana
Użyj metody z Allow albo dodaj handler
404 Not Found
Pod tym URL nie ma zasobu
Popraw ścieżkę
501 Not Implemented
Serwer w ogóle nie obsługuje tej metody
Użyj standardowej metody
403 Forbidden
Metoda jest w porządku, brakuje Ci uprawnień
Uzyskaj dostęp lub zmień konto
Zaznacz metody obsługiwane przez Twoją trasę, wybierz metodę wysyłaną przez klienta, a generator pokaże dokładną odpowiedź, jaką powinien zwrócić serwer: zwykły sukces albo 405 z nagłówkiem Allow zawierającym metody w kolejności, w jakiej je zaznaczyłeś.
Zaznacz każdą metodę, którą Twoja trasa naprawdę obsługuje.
Wybierz metodę używaną przez nieudane żądanie. Pokazuje ją panel Network w Twojej przeglądarce.
Przeczytaj odpowiedź. 405 musi zawierać Allow z każdą zaznaczoną metodą.
Skopiuj poniżej poprawkę pasującą do Twojego frameworka.
Najpierw sprawdź nagłówek Allow w nieudanej odpowiedzi. Mówi on, jakie metody przyjmie serwer, co często ujawnia formularz używający niewłaściwej.
Formularz bez atrybutu method wysyła dane przez GET. Jeśli Twój handler przyjmuje tylko POST, dodaj do formularza method="post".
Końcowy ukośnik lub przekierowanie może po drodze zamienić POST w GET, który następnie trafia na trasę obsługującą tylko POST. Przejrzyj każdy krok w panelu Network.
Pisząc serwer, zwracaj 405 z Allow zamiast 404 dla znanej ścieżki z niewłaściwą metodą. Klienci i narzędzia API mogą wtedy wyjaśnić błąd.
Najczęściej zadawane pytania
Czy 405 to problem klienta czy serwera?
To kod 4xx, więc serwer ma zastrzeżenia do żądania. Albo klient powinien użyć innej metody, albo właściciel serwera powinien dodać obsługę tej, która jest wysyłana.
Czy odpowiedź 405 musi zawierać nagłówek Allow?
Tak. RFC 9110 mówi, że serwer musi wygenerować pole nagłówka Allow z listą metod, które zasób obecnie obsługuje. Pusta lista jest dozwolona, gdy zasób nie przyjmuje żadnych metod.
Dlaczego dostaję 405 przy wysyłaniu formularza?
Zwykle formularz wysyła metodę, której trasa nie akceptuje. Trasa we Flask, na przykład, odpowiada tylko na GET, dopóki nie przekażesz methods=["GET", "POST"] do dekoratora route.
Dlaczego Express daje mi 404 zamiast 405?
Express traktuje niedopasowaną metodę i ścieżkę tak samo: żadna trasa nie odpowiedziała, więc żądanie trafia do handlera 404. Dodaj obsługę ścieżki przez app.all, aby samodzielnie wysłać 405.
Jaka jest różnica między 405 a 501?
405 oznacza, że ten zasób odrzuca metodę, którą serwer rozumie. 501 oznacza, że serwer nie obsługuje tej metody dla żadnego zasobu.
Reguła w specyfikacji
Metoda jest rozpoznawana przez serwer źródłowy, ale docelowy zasób jej nie obsługuje. Ponieważ serwer wie, które metody by zadziałały, specyfikacja wymaga, by przekazał to przez Allow. 405 bez Allow jest niekompletne.
Skąd zwykle bierze się 405
Typowe źródła to trasy frameworków zarejestrowane dla jednej metody, bramki API mapujące każdą metodę osobno oraz serwery plików statycznych, które serwują pliki, ale nie przyjmują zapisów. W każdym przypadku ścieżka pasowała, a metoda nie.
Route handlery w Next.js eksportują jedną funkcję na metodę. Obsługiwane nazwy to GET, POST, PUT, PATCH, DELETE, HEAD i OPTIONS, a gdy nie wyeksportujesz OPTIONS, Next.js odpowie na nie za Ciebie nagłówkiem Allow zbudowanym z wyeksportowanych metod.
Poprawki dla poszczególnych stacków
Flask: zadeklaruj każdą metodę, którą przyjmuje trasa
Bez methods= trasa odpowiada tylko na GET (Flask automatycznie dodaje HEAD i OPTIONS).
Express: wyślij prawdziwe 405 zamiast przechodzić do 404
app.all umieszczone po właściwych handlerach przechwytuje każdą inną metodę dla tej samej ścieżki.
Route handler w Next.js: wyeksportuj metodę, którą wywołujesz
app/api/items/route.ts. Żądanie z metodą, której nie wyeksportowałeś, nie dotrze do Twojego kodu.
HTML: nadaj formularzowi metodę, której oczekuje serwer
Formularz bez atrybutu method jest wysyłany jako GET.
Generator odpowiedzi 405
Metody obsługiwane przez tę trasę
Metoda wysyłana przez klienta
Co serwer powinien odesłać
Metoda jest obsługiwana, więc 405 nie wchodzi w grę.
Metody nie ma na liście, więc odpowiedzią jest 405 z nagłówkiem Allow wymieniającym zaznaczone metody (liczba: {n}).