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

Всем доброго дня!
Сломал мозг.
Использую ESP-07 она же ESP8266…
Проблема с отправкой post запроса на внешний собственный ресурс.
На примере стандартного примера с правкой под мои нужды:

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

#define SERVER_IP "http://selhom.ru/r.php"

#ifndef STASSID
#define STASSID "AndroidAP"
#define STAPSK "qwerty12"
#endif

void setup() {

  Serial.begin(115200);

  WiFi.begin(STASSID, STAPSK);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  if ((WiFi.status() == WL_CONNECTED)) {

    WiFiClient client;
    HTTPClient http;
    Serial.print("[HTTP] begin...\n");
    http.begin(client, SERVER_IP);  
    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) {
        const String& payload = http.getString();
        Serial.println("received payload:\n<<");
        Serial.println(payload);
        Serial.println(">>");
      }
    } else {
      Serial.printf("[HTTP] POST... failed, error: %s\n", http.errorToString(httpCode).c_str());
    }

    http.end();
  }

  delay(10000);
}

получаю ответ 403, нет доступа.
Создал на компе простой код js пост запроса:

<!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>
  <style>
    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; }
  </style>
</head>
<body>
  <h1><span id="module_name">module_name</span></h1>
  <h2>Серийный номер: <span id="uin">uin</span></h2>
  <p id="kod"></p>
  <p id="message"></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("uin").innerHTML = "110100000001";
        document.getElementById("message").innerHTML = response.message;
	};
};
xhr.send(json);

</script>

</body>
</html>

все работает замечательно.
При этом разрешаю CORS файлом .htaccess:

Header always set Access-Control-Allow-Origin: "*"
Header always set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
Header always set Access-Control-Allow-Headers: "*"

Пробовал отправлять post на ресурс http://httpbin.org/post, улетает и прилетает с esp так же без ошибок.

Что где нужно еще покрутить, чтобы с устройства по http://selhom.ru/r.php улетал post запрос без ошибок?
Так же пробовал шапку дописывать:

http.addHeader("Accept", "*/*");
http.addHeader("Accept-Encoding", "gzip, deflate");
http.addHeader("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3");
http.addHeader("Content-Type", "application/json");
http.addHeader("Connection", "keep-alive");
http.addHeader("Origin", "null");
http.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0");

но и от этого толку ноль, что-то еще не пускает.

А на стороне сервера в $_POST что-нибудь прилетает?

При загрузке с браузера без параметров должно быть:

{"kod":"error","message":"Пустой запрос"}

а так, когда ошибка 403, страничка даже не загружается

Значит запрос сформирован не правильно (не корректно). Есть доступ к логам web-сервера? Если есть - прочитай что там пишется.

Вот и я думаю и даже уверен в этом, но логи хоть и включены, но в них почему-то ничего не пишется, бесплатный beget для тестирования использую.
Но, этот же код с запросом проходит:

<!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>
  <style>
    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; }
  </style>
</head>
<body>
  <h1><span id="module_name">module_name</span></h1>
  <h2>Серийный номер: <span id="uin">uin</span></h2>
  <p id="kod"></p>
  <p id="message"></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("uin").innerHTML = "110100000001";
        document.getElementById("message").innerHTML = response.message;
	};
};
xhr.send(json);

</script>

</body>
</html>

Значит сервер отвечает и ошибок нет, код 200.
И с ESP на http://httpbin.org/post формируется запрос корректно, а на http://selhom.ru/r.php получается нет.

Заголовки может что не так, чего не понимаю.
Заголовки из браузера из примера запроса js:

OPTIONS http://selhom.ru/r.php
Ответ

HTTP/1.0 200 OK
Server: nginx-reuseport/1.21.1
Date: Wed, 01 Feb 2023 09:32:30 GMT
Content-Type: application/json
Content-Length: 53
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,OPTIONS,DELETE,PUT
Access-Control-Allow-Headers: *
Connection: keep-alive

Запрос

OPTIONS /r.php HTTP/1.0
Host: selhom.ru
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0
Accept: */*
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Origin: null
Connection: keep-alive

POST http://selhom.ru/r.php
Ответ

HTTP/1.0 200 OK
Server: nginx-reuseport/1.21.1
Date: Wed, 01 Feb 2023 09:32:30 GMT
Content-Type: application/json
Content-Length: 13
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,OPTIONS,DELETE,PUT
Access-Control-Allow-Headers: *
Connection: keep-alive

Запрос

POST /r.php HTTP/1.0
Host: selhom.ru
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0
Accept: */*
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-type: application/json
Content-Length: 86
Origin: null
Connection: keep-alive

На ESP точно резолвится адрес “selhom.ru” ?

точно.
ESP’шке почему то полностью закрыт доступ.
На любую страничку ответ 403 доступ закрыт, хотя через браузер все работает.

могу твой код у себя разместить, один в один, для проверки, если на моём сервере заработает…

если можно, попробуем, создать какой-нибудь файлик php с кодом для ответа

<?php
    $json_mes["kod"] = "error";
    $json_mes["message"] = "Пустой запрос";
    header('Content-Type: application/json'); 
    echo json_encode( $json_mes, JSON_UNESCAPED_UNICODE );
?>

http://orviss.ru/r.php

Наврятли в этом дело, с браузера же работает все.

здесь ошибка 302…

вот видишь коллега, надо делать правильную тестовую страничку для отладки пост запросов с ESP

сейчас гляну ресурс чисто http

302я ошибка - это прихоти твоего сервера.

Но в этом всем есть и плюс - значит на ESP нормально работает DNS.

302 ошибка, перенаправление, скорее всего на индексную страницу или www или еще куда…
403 это ресурс существует, но доступ запрещен
Как он запрещен, если из браузера нормально грузится, не понимаю…
Да и если ESP конектится к чему то другому, то нормально, если к моему сайту, то доступ запрещен…

Пробовал просто “плюнуть” что-то простое с того сервера в ответ ESP?

Чтобы что-то плюнуть, нужно, что бы загрузилась страничка, а этого сервер сделать не дает, ошибка 403 доступ запрещен.
Я сейчас что-то сделал, вообще CORS работать перестал. А что только я до этого не пытался сделать…)))