Piccolo proxy.php che permette di chiamare un’API esterna bypassando i problemi CORS

ho visto sul forum che molti come me hanno problemi CORS. Ho chiesto a chatGPT:
proxy.php

<?php
// Disabilita l'output dei warning PHP
error_reporting(0);

// URL dell'API che vuoi contattare
$targetUrl = 'https://miosito/Comune';

// Parametri passati in GET (es: ?Username=user1)
$queryString = http_build_query($_GET);

// Componi l'URL completo
$url = $targetUrl . '?' . $queryString;

// Imposta l'header di risposta in JSON
header('Content-Type: application/json');
// Consenti chiamate CORS dal tuo dominio
header('Access-Control-Allow-Origin: *');

// Inoltra la richiesta
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Se serve autenticazione aggiungila qui:
// curl_setopt($ch, CURLOPT_HTTPHEADER, [
//   "Authorization: Basic xxx"
// ]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// Passa il codice HTTP corretto in uscita
http_response_code($httpCode);

// Restituisci il contenuto ricevuto
echo $response;

:white_check_mark: Come usarlo

  1. Salvalo come proxy.php nel tuo sito:
    https://www.giopoi.it/gestausiljs/proxy.php

(qui parla di javascript, ma lo si può usare da qualsiasi linguaggio)
2. Dal tuo JavaScript, al posto di:

js

fetch('https://miosito/Comune?Username=user1')

usa:

js

fetch('proxy.php?Username=user1')

:puzzle_piece: Se hai più endpoint?

Puoi estendere il proxy con un parametro url, ma attenzione a non esporre rischi di abuso. Se vuoi posso aiutarti a creare una versione più sicura e flessibile (con whitelist di URL ammessi, log, ecc.).

Fammi sapere se ti serve anche il supporto a POST, PUT, DELETE, o autenticazione con token, che si può fare in pochi minuti :wink:

In ogni caso chiedete direttamente a chatGPT

NOTE

  1. Io non l’ho ancora provato.
  2. Se non volete abilitare PHP sul vs server chiede di usare c# o altro.
1 Mi Piace

@poidomani47 interessante come soluzione, ChatGPT su queste cose se la cava bene, ma non è forse più corretto modificare il proprio server web per includere gli indirizzi CORS che la tua web app utilizza?

sì ma tutti i post sul forum che trattano questo problema non hanno mai fornito la soluzione e sono tutti bloccati, o sbaglio? :upside_down_face:

Io ho fatto una semplice domanda alla nostra amichevole intelligenza artificiale di quartiere ( :laughing:) il ChatGPT e queste le sue risposte per IIS:

Metodo 1: Aggiunta nel web.config (per siti ASP.NET Core, an open-source web development framework | .NET API)

Questo è il metodo più usato e non richiede modifiche al codice.

Esempio base web.config:

xml

CopiaModifica

<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <!-- Consenti richieste da qualsiasi origine -->
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
        <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

:locked: Se vuoi limitare solo a un dominio specifico:

xml

CopiaModifica

<add name="Access-Control-Allow-Origin" value="https://www.miosito.it" />

:warning: Importante: supporto alle richieste OPTIONS

  • Le richieste CORS usano spesso il metodo OPTIONS per il preflight.
  • IIS potrebbe bloccarle se non abilitate correttamente.

:wrench: Soluzione:

  • Permetti il metodo OPTIONS in web.config:

xml

CopiaModifica

<system.webServer>
  <handlers>
    <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="IsapiModule" resourceType="Unspecified" requireAccess="Script" />
  </handlers>
</system.webServer>

Metodo 2: Uso del modulo IIS CORS (solo Windows Server 2019+)

IIS 10 (su Windows Server 2019 o 2022) ha un modulo ufficiale CORS.

Passaggi:

  1. Apri Server ManagerAggiungi Ruoli e funzionalità
  2. Vai su Server Web (IIS)Web ServerPerformance
  3. Attiva la feature CORS Module

Poi, nel web.config puoi usare:

xml

CopiaModifica

<system.webServer>
  <cors enabled="true">
    <add origin="https://www.miosito.it" />
  </cors>
</system.webServer>

:white_check_mark: Metodo 3: Aggiunta manuale nei response headers da IIS Manager

  1. Apri IIS Manager
  2. Seleziona il tuo sito → doppio clic su HTTP Response Headers
  3. Aggiungi:
  • Nome: Access-Control-Allow-Origin
  • Valore: * o il dominio che vuoi autorizzare

Questo metodo è semplice ma meno flessibile e non gestisce correttamente i preflight OPTIONS.

Tralascio la modalità da programmazione che mi ha passato del codice C#.

In ogni caso @poidomani47 grazie sempre dei tuoi contributi sull’intelligenza artificiale.

2 Mi Piace

Ah ecco!!! Io di solito non metto mano al web.config, lo fanno altri.
Quindi cercavo qui nel manuale delle Web API:
Web API
1 Introduzione
2 Come creare Web API con Instant Developer
3 Specifiche delle chiamate a Web API
4 Esempi di chiamate

Ottimo, allora è semplicissimo! Butto il piccolo proxy :sad_but_relieved_face:
Grazie mille!!!

2 Mi Piace

Le impostazioni CORS essendo una caratteristica del web server non sono nella documentazione delle Web API, in questo manuale è spiegato come realizzarle con Instant Developer Foundation e nel caso di installazione su IIS mi devo guardare il suo help.