У меня есть веб-сайт с HTML-формой, которая при отправке успешно отправляет запрос POST в файл .php на сервере (Apache 2.4.48).
Однако, когда я разрешаю Javascript обрабатывать отправку через JS fetch(), сервер отвечает ошибкой 405.
Итак, я проанализировал заголовки запроса и ответа для двух POST, и они почти идентичны, поэтому я не понимаю, почему работает первый метод, а другой получает отказ.
Ниже приведен запрос/ответ при отправке через HTML-форму (восклицательные знаки там, где POST-запросы отличаются):
ГЕНЕРАЛЬНЫЙ
URL запроса: https://example.com/php/script.php
Метод запроса: POST
Код состояния: 302
Удаленный адрес: 160.153.133.187:443
Политика реферера: происхождение-при-перекрестном происхождении
ЗАГОЛОВКИ ОТВЕТОВ
управление кешем: max-age=0 !
длина содержимого: 0
тип содержимого: текст/html; кодировка = UTF-8
дата: сб, 14 августа 2021 г., 23:21:34 по Гринвичу
истекает: сб, 14 августа 2021 г., 23:21:34 по Гринвичу
местоположение: https://example.com/pages/form-submitted.html#submitted
сервер: Апач
различаться: User-Agent
x-на основе: PHP/8.0.8
ЗАГОЛОВКИ ЗАПРОСА
:авторитет: example.com
:метод: ПОСТ
:путь: /php/script.php
:схема: https
принимать: текст/html, приложение/xhtml+xml, приложение/xml; q = 0,9, изображение / avif, изображение / webp, изображение / apng, */*; q = 0,8, приложение / подписанный обмен; v = b3; д=0,9 !
принять кодировку: gzip, deflate, br
принять-язык: en-GB,en;q=0.9,es-ES;q=0.8,es;q=0.7,it-IT;q=0.6,it;q=0.5
кеш-контроль: без кеша
длина содержимого: 96
тип контента: application/x-www-form-urlencoded !
днт: 1
происхождение: https://example.com
прагма: без кеша
реферер: https://example.com/contact
sec-ch-ua: "Chromium";v="92", "Не бренд";v="99", "Google Chrome";v="92"
сек-ч-уа-мобиль: ?0
sec-fetch-dest: документ!
sec-fetch-mode: навигация!
sec-fetch-site: того же происхождения
сек-выборка-пользователь: ?1
небезопасные запросы на обновление: 1
пользовательский агент: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, например Gecko) Chrome/92.0.4515.131 Safari/537.36
ФОРМА ДАННЫХ
Название: Тай Дзен
электронная почта: [email protected]
номер телефона: 12345678910
согласие на конфиденциальность: включено
представить:
Вместо этого ниже это запрос/ответ при отправке POST с использованием fetch():
ГЕНЕРАЛЬНЫЙ
URL запроса: https://example.com/php/script.php
Метод запроса: POST
Код состояния: 302
Удаленный адрес: 160.153.133.187:443
Реферальная политика: тот же источник
ЗАГОЛОВКИ ОТВЕТОВ
кеш-контроль: max-age=2741
длина содержимого: 0
тип содержимого: текст/html; кодировка = UTF-8
дата: суббота, 14 августа 2021 г., 23:31:44 по Гринвичу
истекает: вс, 15 августа 2021 г., 00:17:26 по Гринвичу
местоположение: https://example.com/405
сервер: Апач
различаться: User-Agent
x-на основе: PHP/8.0.8
ЗАГОЛОВКИ ЗАПРОСА
:авторитет: example.com
:метод: ПОСТ
:путь: /php/script.php
:схема: https
принимать: */*
принять кодировку: gzip, deflate, br
принять-язык: en-GB,en;q=0.9,es-ES;q=0.8,es;q=0.7,it-IT;q=0.6,it;q=0.5
кеш-контроль: без кеша
длина содержимого: 471
тип содержимого: multipart/form-data; граница=----WebKitFormBoundary28YayN0mmqwdpQh0
днт: 1
происхождение: https://example.com
прагма: без кеша
реферер: https://example.com/contact
sec-ch-ua: "Chromium";v="92", "Не бренд";v="99", "Google Chrome";v="92"
сек-ч-уа-мобиль: ?0
пункт назначения сек-выборки: пусто
sec-fetch-mode: тот же источник
sec-fetch-site: того же происхождения
пользовательский агент: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, например Gecko) Chrome/92.0.4515.131 Safari/537.36
ФОРМА ДАННЫХ
Название: Тай Дзен
электронная почта: [email protected]
номер телефона: 12345678910
согласие на конфиденциальность: включено
представить:
Должен ли я что-то изменить на стороне сервера, чтобы разрешить запросы POST к этому конкретному файлу?
Однако я бы хотел, чтобы он получал POST-запросы только от JS, который я написал, а не от внешних сущностей, но я точно не знаю, как это сделать. Я попробовал то, что было предложено на этот ответ, но не получилось, сервер выдал 500 ошибку. Я предполагаю, что это может быть из-за того, что я пользуюсь планом общего хостинга и не имею полного доступа к своим настройкам Apache, но я не уверен, что это причина.