Ну а GET так же себя ведет?
Проверял до это, да, так же. Понять не могу, почему девайсу доступ запрещен… Что ему мешает именно на конкретном хосте???
Мне больше странно - почему логи не пишет? 403я должна попадать в лог.
Вот например на одном из серверов:
[Tue Jan 31 10:08:20.043455 2023] [autoindex:error] [pid 99507:tid 140140286572288] [client 43.135.172.53:65448] AH01276: Cannot serve directory /home/clients/###/domains/###/html/wp-admin/css/: No matching DirectoryIndex (index.html,index.cgi,index.pl,index.php,index.xhtml,index.htm) found, and server-generated directory index forbidden by Options directive, referer: binance.com
Файл - error.log
Буду завтра еще кубатурить, хостинг бесплатный, логи включены, но в них ничего не падает. Сегодня уже домой. Спасибо за помощь!!!
Я бы поднял XAMPP на своём компе и ESP натравил на него для начала. Мало ли что там хостер фильтрует.
Давеча был тут один товарищ - обозлился на то, что мы ему не подсказали, что у него на сервере фаервол был включен.
Я ещё на двух хостах проверил, там 301 ошибки - редирект…
Вот просто так решил проверить:
Вот код для ЕСП8266, из примера, только джЫсон от ТС добавлен и ГЕТ на ПОСТ заменен!
Спойлер
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
ESP8266WiFiMulti WiFiMulti;
void setup() {
Serial.begin(115200);
// Serial.setDebugOutput(true);
Serial.println();
Serial.println();
Serial.println();
for (uint8_t t = 4; t > 0; t--) {
Serial.printf("[SETUP] WAIT %d...\n", t);
Serial.flush();
delay(1000);
}
WiFi.mode(WIFI_STA);
WiFiMulti.addAP("42km", "**********");
}
void loop() {
// wait for WiFi connection
if ((WiFiMulti.run() == WL_CONNECTED)) {
WiFiClient client;
HTTPClient http;
Serial.print("[HTTP] begin...\n");
if (http.begin(client, "http://10.168.13.1/1/w3POST.php")) { // HTTP
http.addHeader("Content-Type", "application/json");
Serial.print("[HTTP] POST...\n");
int httpCode = http.POST("{\"hello\":\"world\"}");
if (httpCode > 0) {
Serial.printf("[HTTP] POST... code: %d\n", httpCode);
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
Serial.println(payload);
}
} else {
Serial.printf("[HTTP] POST... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
} else {
Serial.printf("[HTTP} Unable to connect\n");
}
}
delay(10000);
}
Вот строчкм на пХп, прямо из примера с w3scool, штоп не ходит далеко. Ну немного йУмора добавлено от меня:
Спойлер
<html>
<body>
<p>TEST
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$data = json_decode(file_get_contents('php://input'), true);
echo "Hello what?! - Hello ".$data["hello"]."!";
}
?>
</body>
</html>
вот вывод сериала:
[HTTP] begin...
[HTTP] POST...
[HTTP] POST... code: 200
<html>
<body>
<p>TEST
Hello what?! - Hello world!
</body>
</html>
[HTTP] begin...
[HTTP] POST...
[HTTP] POST... code: 200
<html>
<body>
<p>TEST
Hello what?! - Hello world!
</body>
</html>
Отсюда мораль, что либо пхп не включен у хостера, либо фильтр по клиентам, это заголовками исправлять надо (вот это скорее всего). Еще могут быть перекресные запросы запрещены, но ТС вроде просто от клиента к серверу обращается, без хитростей? Може скрывает что?
ЗЫ: ой. прям пароль от ВиФи не “зазвездил” Жуть! Ессно, что это я на своем сервере ставил, на Апач2, если что, и строка в настройках ровно одна - разрешить пХп.
Access-Control-Allow-Credentials true
Access-Control-Allow-Headers *
Access-Control-Allow-Methods GET,POST,OPTIONS,DELETE,PUT
Access-Control-Allow-Origin *
Access-Control-Max-Age 3600
Connection keep-alive
Content-Length 53
Content-Type application/json
Date Wed, 01 Feb 2023 14:53:18 GMT
Keep-Alive timeout=30
Server nginx-reuseport/1.21.1
X-Content-Type-Options nosniff
X-Powered-By PHP/7.4.33
X-XSS-Protection 1; mode=block
у мну его код на моём сервере работает:
[HTTP] begin...
[HTTP] POST...
[HTTP] POST... code: 200
received payload:
<<
{"kod":"error","message":"Пустой запрос"}
>>
А на его сервере - НЕТ!
Проблема на сервере:
[HTTP] begin...
[HTTP] POST...
[HTTP] POST... code: 403
[HTTP] begin...
[HTTP] POST...
[HTTP] POST... code: 403
С девайса да, с ошибкой 403.
Но как объясняется то, что js запрос с простой веб странички проходит успешно с ответом 200???
Пример js запроса с html странички в первом посте приводил.
То есть скрипты работают, да и веб сайт php работал, сейчас временно потёр в связи с этим багом.
Вся проблема встала со связью с устройством.
Твой код на моём сервере работает, на твоём - нет, проблема именно на сервере, виртуальный хостинг?
видимо это?
Исходя из этого:
Access-Control-Allow-Credentials true
Access-Control-Allow-Headers *
Access-Control-Allow-Methods GET,POST,OPTIONS,DELETE,PUT
Access-Control-Allow-Origin *
Тем не менее, если создать файл к html даже на рабочем столе с кодом:
‘’’
module_name
Серийный номер: uin
''' который делает пост запрос, который прекрасно выполняется.ты разрешаешь серверу делать запросы к другим серверам от имени пользователя (представляться им), чтобы это было возможно, сервер пытается идентифицировать тебя, когда это браузер, то он возвращает свои идентификационные данные, а ESP - нет
я бы попробовал
Access-Control-Allow-Credentials false
здесь BOOM специалист, я то застрял на технологиях 20 летней давности
Завтра попробую, с ключом false не пробовал
не спасает.
Это что-то с чем-то ))) простые пост запросы от javascript обрабатываются, а от ESP нет… У меня уже нервный тик скоро будет… главное понять не могу почему, то ли баг, то ли хостинг, то ли все таки я что-то не понимаю и делаю не так, хотя на прочие хосты с ESP запросы прекрасно работают.
Выше писал с телефона, закоментить не получилось, этот код html даже с рабочего стола по тому же адресу шлет и получает ответ, почему ESP так не может:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" charset="utf-8" content="width=device-width, initial-scale=1.0, user-scalable=no">
<title>module_name</title>
</head>
<body>
<p id="kod">NULL</p>
<p id="message">NULL</p>
<script>
let xhr = new XMLHttpRequest();
let json = JSON.stringify({
"kod":"ping"
});
//xhr.open("POST", 'http://httpbin.org/post');
xhr.open("POST", 'http://selhom.ru/r.php');
xhr.setRequestHeader('Content-type', 'application/json');
xhr.responseType = 'json';
xhr.onload = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var response = xhr.response;
document.getElementById("kod").innerHTML = response.kod;
document.getElementById("message").innerHTML = response.message;
};
};
xhr.send(json);
</script>
</body>
</html>
Не преувеличивай мои знания, они на уровне 15 летней давности
ТС, по всей видимости проблема в хостинге. Скорее всего они фильтруют “железячный” трафик (интернет вещей).
Может быть только на бесплатных тарифах, а на платных такого нет. А может быть и вообще.
Попробуй вот этих ребят, у них нет бесплатных тарифов (вроде бы), зато платный “Минимальный” всего 60руб./год (сможешь себе позволить для тестов?) (1 сайт, 1Гб места, 1 бд + бесплатный сертификат от Let’s Encrypt).
Нужны два действия:
- посмотреть логи при работе с чистым httpd;
- запулить post простым текстом, а не библиотекой.
Далее решать.
Говорит, что в логах ничего нет.
И мне думается это не зря, что еще больше убеждает в фильтрации трафика.
А вот как такое сделать с ESP, признаться, я не знаю. Ни разу дел с ESP не имел.
Так же, как и с обычной ардуиной и Ethernet.
В client засунуть запрос, подсмотренный у wget/curl/etc.
Кстати можно попробовать… через client