Am un site web cu un formular HTML care, atunci când este trimis, trimite cu succes o solicitare POST către un fișier .php de pe server (Apache 2.4.48).
Cu toate acestea, când las Javascript să se ocupe de trimiterea printr-un JS fetch(), serverul răspunde cu o eroare 405.
Așa că am analizat anteturile de cerere și răspuns pentru cele două POST și sunt aproape identice, așa că sunt confuz de ce funcționează prima metodă și cealaltă este refuzată.
Următoarea este cererea/răspunsul la trimiterea prin formularul HTML (punctele de exclamare sunt acolo unde solicitările POST diferă):
GENERAL
Adresa URL a solicitării: https://example.com/php/script.php
Metoda de solicitare: POST
Cod de stare: 302
Adresă de la distanță: 160.153.133.187:443
Politica referitor: origin-when-cross-origin
ANTETE DE RĂSPUNS
cache-control: max-age=0 !
lungimea conținutului: 0
tip de conținut: text/html; set de caractere=UTF-8
data: sâmbătă, 14 august 2021 23:21:34 GMT
expiră: sâmbătă, 14 august 2021 23:21:34 GMT
locație: https://example.com/pages/form-submitted.html#submitted
server: Apache
variază: User-Agent
x-alimentat de: PHP/8.0.8
ANTETE DE CERERE
:authority: example.com
:metoda: POST
:cale: /php/script.php
:scheme: https
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3; q=0,9 !
accept-encoding: gzip, deflate, br
accept-limba: en-GB,en;q=0.9,es-ES;q=0.8,es;q=0.7,it-IT;q=0.6,it;q=0.5
cache-control: fără cache
Lungimea conținutului: 96
tipul de conținut: application/x-www-form-urlencoded !
dnt: 1
origine: https://example.com
pragma: fără cache
referer: https://example.com/contact
sec-ch-ua: "Chromium";v="92", " Nu este A;Brand";v="99", "Google Chrome";v="92"
sec-ch-ua-mobile: ?0
sec-fetch-dest: document !
sec-fetch-mode: navigați!
sec-fetch-site: aceeași origine
sec-fetch-user: ?1
solicitări-upgrade-nesigure: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, ca Gecko) Chrome/92.0.4515.131 Safari/537.36
DATE FORMULARE
nume: Tai Zen
e-mail: [email protected]
numar de telefon: 12345678910
confidențialitate-consimțământ: activat
Trimite:
Mai jos, în schimb, este cererea/răspunsul atunci când trimiteți un POST folosind fetch():
GENERAL
Adresa URL a solicitării: https://example.com/php/script.php
Metoda de solicitare: POST
Cod de stare: 302
Adresă de la distanță: 160.153.133.187:443
Politica referitor: aceeași origine
ANTETE DE RĂSPUNS
cache-control: max-age=2741
lungimea conținutului: 0
tip de conținut: text/html; set de caractere=UTF-8
data: sâmbătă, 14 august 2021 23:31:44 GMT
expiră: Duminică, 15 august 2021 00:17:26 GMT
locație: https://example.com/405
server: Apache
variază: User-Agent
x-alimentat de: PHP/8.0.8
ANTETE DE CERERE
:authority: example.com
:metoda: POST
:cale: /php/script.php
:scheme: https
Accept: */*
accept-encoding: gzip, deflate, br
accept-limba: en-GB,en;q=0.9,es-ES;q=0.8,es;q=0.7,it-IT;q=0.6,it;q=0.5
cache-control: fără cache
lungimea conținutului: 471
tip-conținut: date-multiparte/form-date; limită=----WebKitFormBoundary28YayN0mmqwdpQh0
dnt: 1
origine: https://example.com
pragma: fără cache
referer: https://example.com/contact
sec-ch-ua: "Chromium";v="92", " Nu este A;Brand";v="99", "Google Chrome";v="92"
sec-ch-ua-mobile: ?0
sec-fetch-dest: gol
sec-fetch-mode: aceeași origine
sec-fetch-site: aceeași origine
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, ca Gecko) Chrome/92.0.4515.131 Safari/537.36
DATE FORMULARE
nume: Tai Zen
e-mail: [email protected]
numar de telefon: 12345678910
confidențialitate-consimțământ: activat
Trimite:
Ar trebui să schimb ceva din partea serverului pentru a permite solicitările POST către acel fișier specific?
Totuși, mi-aș dori să primească solicitări POST doar de la JS-ul pe care l-am scris și nu de la entități externe, dar nu știu exact cum să o fac. Am încercat ceea ce s-a sugerat acest raspuns, dar nu a funcționat, serverul a dat o eroare 500. Presupun că poate fi din cauză că am un plan de găzduire partajată și nu am acces complet la setările mele Apache, dar nu sunt sigur că acesta este motivul.