@Kadenoff

Ошибки CORS 405 при записи — как записать инфу в файл?

При разработке сайта столкнулся с ошибками 405 cors. Почему не пишется информация в файл на php, js? вместо этого валятся ошибки
Сервер - пк на linux, nginx. Специально уже испаравлял конфиги NGINX, код с enable-cors.org/server_nginx.html , не должно быть cors ошибок и 405.

Суть - с полей ввода данных при нажатии кнопки информация должна отправляться на заапись в файл или отображаться на другую веб страницу этого же сайта, но вместо этого выдает ошибку CORS и 405, в чем дело?
Информация почему не записывается ни в веб страницу ни в файл?
Не работает код ни на jS ни PHP.

Код на JS (не рабочий кусок, 100 разных попыток уже было и записи в файл, и отправки по URL) -

let formData = new FormData(document.forms.input_data);
  let xhr = new XMLHttpRequest();
  xhr.open("POST", "http://127.0.0.1/postinf/inf.txt");
  xhr.send(formData);
 xhr.onload = () => alert(xhr.response);
  console.log(JSON.stringify(formData));

/*let response = fetch('/postinf/inf.cgi', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  },
  body: JSON.stringify(formData)
});

let result = response.json();
alert(result.message);  
*/

//serialize для передачи по url
function serialize (a) {
var s = [];
if (a.constructor === Array) {
    for (var i=0; i<a.length; i++)
    s.push(a[i].name + '=' + encodeURIComponent(a[i].value));
} else {
    for (var j in a)
    s.push(j + '=' + encodeURIComponent(a[j]));
}
return s.join('&');
}


Далее решил попробовать на PHP, начал с примера из книги PHP 7 (Котеров Симдянов) стр 80,
Код на PHP:

<head>
<title> Получение данных POST </title>
<meta charset='utf-8'>
</head>
<body>
<form action="/script.cgi?param=value" method="POST">
<p> Name1: <input type="text" name="name1"></p>
<p> Name2: <input type="text" name="name2"></p>
<p><input type="submit" value="Запустить сценарий!"></p>
</form>
</body>


Код для PHP на C:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
char *remote_addr = getenv("REMOTE_ADDR");
char *content_length = getenv("CONTENT_LENGTH");
char *query_string = getenv("QUERY_STRING");

int num_bytes = atoi(content_length);

char *data = (char *)malloc(num_bytes + 1);
fread(data, 1, num_bytes, stdin);

data[num_bytes] = 0;

printf("Content-type: text/html\n\n");
printf("<!DOCTYPE html>");
printf("<html lang='ru'>");
printf("<head>");
printf("<title> Получение данных POST </title>");
printf("<meta charset='utf-8'>");
printf("</head>");
printf("<body>");
printf("<h1> Мы знае о тебе все </h1>");
printf("<p> ваш ip = %s</p>", remote_addr);
printf("<p> Количество байт данных: %d</p>", num_bytes);
printf("<p> Указанные параметры: %s</p>", data);
printf("<p> Получено через URL: %s</p>", query_string);
printf("</body></html>");
}


Почему эта дрянь только плюются ошибками и ничего никуда не записывает?
  • Вопрос задан
  • 363 просмотра
Пригласить эксперта
Ответы на вопрос 1
delphinpro
@delphinpro Куратор тега PHP
frontend developer
Когда к серверу идёт запрос с другого домена, то сервер должен отправить в ответ CORS заголовки (из семейства Access-Control-*), если он хочет разрешить взаимодействие.

Если браузер получит такие заголовки и их содержимое его устроит, то он отдаст ответ сервера на обработку вашим скриптам.

Стоит помнить, что на уровне протокола HTTP никакого CORS нет, и, например, через CURL вы всегда можете получить ответ (сервер-сервер).

Таким образом, если целевой сервер под вашим контролем, то просто научите его отдавать необходимые CORS-заголовки. Если это сторонний сервер, то воспользуйтесь либо документацией к нему, либо небольшим прокси-сервером (даже проще - прокси-скриптом) на своем сервере.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы