Wie kann ich POST an eine PHP-Datei in Apache nur vom gleichen Ursprung aus zulassen?

Wie kann ich POST an eine PHP-Datei in Apache nur vom gleichen Ursprung aus zulassen?

Ich habe eine Website mit einem HTML-Formular, das beim Absenden erfolgreich eine POST-Anfrage an eine .php-Datei auf dem Server (Apache 2.4.48) sendet.

Wenn ich die Übermittlung jedoch über Javascript mittels JS fetch() abwickeln lasse, antwortet der Server mit einem 405-Fehler.

Ich habe also die Anforderungs- und Antwortheader für die beiden POSTs analysiert und sie sind nahezu identisch. Daher bin ich verwirrt, warum die erste Methode funktioniert und die andere abgelehnt wird.

Nachfolgend sehen Sie die Anfrage/Antwort beim Senden über das HTML-Formular (die POST-Anfragen unterscheiden sich durch die Ausrufezeichen):

GENERAL
Request URL: https://example.com/php/script.php
Request Method: POST
Status Code: 302 
Remote Address: 160.153.133.187:443
Referrer Policy: origin-when-cross-origin


RESPONSE HEADERS
cache-control: max-age=0                    !
content-length: 0
content-type: text/html; charset=UTF-8
date: Sat, 14 Aug 2021 23:21:34 GMT
expires: Sat, 14 Aug 2021 23:21:34 GMT
location: https://example.com/pages/form-submitted.html#submitted
server: Apache
vary: User-Agent
x-powered-by: PHP/8.0.8


REQUEST HEADERS
:authority: example.com
:method: POST
:path: /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-language: 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: no-cache
content-length: 96
content-type: application/x-www-form-urlencoded     !
dnt: 1
origin: https://example.com
pragma: no-cache
referer: https://example.com/contact
sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"
sec-ch-ua-mobile: ?0
sec-fetch-dest: document        !
sec-fetch-mode: navigate        !
sec-fetch-site: same-origin
sec-fetch-user: ?1
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36


FORM DATA
name: Tai Zen
email: [email protected]
phone-number: 12345678910
privacy-consent: on
submit: 

Unten sehen Sie stattdessen die Anfrage/Antwort beim Senden eines POST mit fetch():

GENERAL
Request URL: https://example.com/php/script.php
Request Method: POST
Status Code: 302 
Remote Address: 160.153.133.187:443
Referrer Policy: same-origin


RESPONSE HEADERS
cache-control: max-age=2741
content-length: 0
content-type: text/html; charset=UTF-8
date: Sat, 14 Aug 2021 23:31:44 GMT
expires: Sun, 15 Aug 2021 00:17:26 GMT
location: https://example.com/405
server: Apache
vary: User-Agent
x-powered-by: PHP/8.0.8


REQUEST HEADERS
:authority: example.com
:method: POST
:path: /php/script.php
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: 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: no-cache
content-length: 471
content-type: multipart/form-data; boundary=----WebKitFormBoundary28YayN0mmqwdpQh0
dnt: 1
origin: https://example.com
pragma: no-cache
referer: https://example.com/contact
sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"
sec-ch-ua-mobile: ?0
sec-fetch-dest: empty
sec-fetch-mode: same-origin
sec-fetch-site: same-origin
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36

FORM DATA
name: Tai Zen
email: [email protected]
phone-number: 12345678910
privacy-consent: on
submit:

Muss ich serverseitig etwas ändern, um POST-Anfragen an diese bestimmte Datei zuzulassen?

Ich möchte jedoch, dass es nur POST-Anfragen von dem von mir geschriebenen JS und nicht von externen Entitäten empfängt, aber ich weiß nicht genau, wie das geht. Ich habe versucht, was aufdiese Antwort, aber es hat nicht funktioniert, der Server hat einen 500-Fehler ausgegeben. Ich vermute, dass es daran liegen könnte, dass ich einen Shared-Hosting-Plan habe und keinen vollständigen Zugriff auf meine Apache-Einstellungen habe, aber ich bin nicht sicher, ob das der Grund ist.

verwandte Informationen