Post запросы на общедоступный собственный сайт

Ну а 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> 

Отсюда мораль, что либо пхп не включен у хостера, либо фильтр по клиентам, это заголовками исправлять надо (вот это скорее всего). Еще могут быть перекресные запросы запрещены, но ТС вроде просто от клиента к серверу обращается, без хитростей? Може скрывает что? :wink:

ЗЫ: ой. прям пароль от ВиФи не “зазвездил” :wink: Жуть! Ессно, что это я на своем сервере ставил, на Апач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 html {font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center; } body {margin-top: 50px; background-color: #F5F5DC; } h1 {color: #444444; margin: 50px auto 30px; } h2 {color: #444444; margin-bottom: 20px; font-size: 20px; } p {font-size: 14px; color: #888; margin-bottom: 10px; }

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 летней давности :smiley:

ТС, по всей видимости проблема в хостинге. Скорее всего они фильтруют “железячный” трафик (интернет вещей).
Может быть только на бесплатных тарифах, а на платных такого нет. А может быть и вообще.

Попробуй вот этих ребят, у них нет бесплатных тарифов (вроде бы), зато платный “Минимальный” всего 60руб./год (сможешь себе позволить для тестов?) :smiley: (1 сайт, 1Гб места, 1 бд + бесплатный сертификат от Let’s Encrypt).

Нужны два действия:

  1. посмотреть логи при работе с чистым httpd;
  2. запулить post простым текстом, а не библиотекой.

Далее решать.

Говорит, что в логах ничего нет.
И мне думается это не зря, что еще больше убеждает в фильтрации трафика.

А вот как такое сделать с ESP, признаться, я не знаю. Ни разу дел с ESP не имел.

Так же, как и с обычной ардуиной и Ethernet.

В client засунуть запрос, подсмотренный у wget/curl/etc.

Кстати можно попробовать… через client