

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Utilizzo della funzionalità Cross-Origin Resource Sharing (CORS)
<a name="cors"></a>

La funzionalità CORS (Cross-Origin Resource Sharing, condivisione delle risorse multiorigine) definisce un metodo con cui le applicazioni Web dei clienti caricate in un dominio possono interagire con le risorse situate in un dominio differente. Con il supporto della funzionalità CORS, è possibile creare applicazioni Web lato client complete con Amazon S3 e concedere l'accesso multiorigine alle risorse di Amazon S3 in modo selettivo. 

In questa sezione viene fornita una panoramica della funzionalità CORS. I sottoargomenti descrivono come abilitare CORS utilizzando la console Amazon S3 o a livello di codice utilizzando l'API REST di Amazon S3 e il. AWS SDKs 

## Cross Origin Resource Sharing (CORS): scenari dei casi d'uso
<a name="example-scenarios-cors"></a>

Di seguito sono riportati alcuni scenari di esempio per l'uso della funzionalità CORS.

**Scenario 1**  
Si supponga di ospitare un sito Web in un bucket Amazon S3 denominato `website`, come descritto in [Hosting di un sito Web statico tramite Amazon S3](WebsiteHosting.md). Gli utenti caricano l'endpoint del sito Web:

```
http://website.s3-website.us-east-1.amazonaws.com
```

Ora vuoi utilizzarlo JavaScript sulle pagine Web archiviate in questo bucket per poter effettuare richieste GET e PUT autenticate sullo stesso bucket utilizzando l'endpoint dell'API Amazon S3 per il bucket,. `website.s3.us-east-1.amazonaws.com` Normalmente un browser JavaScript impedirebbe l'autorizzazione di tali richieste, ma con CORS puoi configurare il tuo bucket per abilitare esplicitamente le richieste provenienti da più origini. `website.s3-website.us-east-1.amazonaws.com` 

**Scenario 2**  
Si supponga di voler ospitare un font Web dal bucket S3. Anche in questo caso, i browser richiedono un controllo della funzionalità CORS (anche denominato "controllo preliminare") per il caricamento dei font Web. È necessario configurare il bucket che ospita il font Web in modo da consentire a qualsiasi origine di eseguire queste richieste.

## In che modo Amazon S3 valuta la configurazione CORS in un bucket?
<a name="cors-eval-criteria"></a>

Quando Amazon S3 riceve una richiesta preliminare da un browser, valuta la configurazione CORS per il bucket e utilizza la prima regola `CORSRule` corrispondente alla richiesta del browser in entrata per abilitare una richiesta multiorigine. Per garantire la corrispondenza tra la regola e la richiesta, è necessario che siano soddisfatte le condizioni elencate di seguito.
+ L'intestazione `Origin` di una richiesta CORS al bucket deve corrispondere alle origini dell'elemento `AllowedOrigins` nella configurazione CORS.
+ I metodi HTTP specificati in `Access-Control-Request-Method` in una richiesta CORS al bucket devono corrispondere al metodo o ai metodi elencati nell'elemento `AllowedMethods` della configurazione CORS. 
+ Le intestazioni elencate nell'intestazione `Access-Control-Request-Headers` di una richiesta di verifica devono corrispondere alle intestazioni dell'elemento `AllowedHeaders` nella configurazione CORS. 

**Nota**  
Le policy ACLs and continuano ad essere applicate quando abiliti CORS sul tuo bucket.

## In che modo Punto di accesso per le espressioni Lambda dell'oggetto supporta CORS
<a name="cors-olap-cors"></a>

Quando Lambda per oggetti Amazon S3 riceve una richiesta da un browser o la richiesta include un'intestazione `Origin`, Lambda per oggetti Amazon S3 aggiunge sempre un campo di intestazione `"AllowedOrigins":"*"`.

Per ulteriori informazioni sull'uso di CORS, consulta gli argomenti riportati di seguito.

**Topics**
+ [Cross Origin Resource Sharing (CORS): scenari dei casi d'uso](#example-scenarios-cors)
+ [In che modo Amazon S3 valuta la configurazione CORS in un bucket?](#cors-eval-criteria)
+ [In che modo Punto di accesso per le espressioni Lambda dell'oggetto supporta CORS](#cors-olap-cors)
+ [Elementi di una configurazione CORS](ManageCorsUsing.md)
+ [Configurazione della funzionalità Cross-Origin Resource Sharing (CORS)](enabling-cors-examples.md)
+ [Test di CORS](testing-cors.md)
+ [Risoluzione dei problemi di CORS](cors-troubleshooting.md)

# Elementi di una configurazione CORS
<a name="ManageCorsUsing"></a>

Per configurare il bucket in modo da consentire le richieste multiorigine, si crea una configurazione CORS. La configurazione CORS è un documento con elementi che identificano le origini che potranno accedere al bucket, le operazioni (metodi HTTP) supportate per ogni origine e altre informazioni specifiche dell'operazione. È possibile aggiungere fino a 100 regole alla configurazione. È possibile aggiungere la configurazione CORS come risorsa secondaria `cors` al bucket.

Se configura CORS nella console S3, è necessario utilizzare JSON per creare una configurazione CORS. La nuova console S3 supporta solo configurazioni JSON CORS. 

Per ulteriori informazioni sulla configurazione CORS e sugli elementi in essa contenuti, consulta gli argomenti riportati di seguito. Per istruzioni su come aggiungere una configurazione CORS, consulta [Configurazione della funzionalità Cross-Origin Resource Sharing (CORS)](enabling-cors-examples.md).

**Importante**  
Nella console S3, la configurazione CORS deve essere JSON. 

**Topics**
+ [Elemento `AllowedMethods`](#cors-allowed-methods)
+ [Elemento `AllowedOrigins`](#cors-allowed-origin)
+ [Elemento `AllowedHeaders`](#cors-allowed-headers)
+ [Elemento `ExposeHeaders`](#cors-expose-headers)
+ [Elemento `MaxAgeSeconds`](#cors-max-age)
+ [Esempi di configurazioni CORS](#cors-example-1)

## Elemento `AllowedMethods`
<a name="cors-allowed-methods"></a>

Nella configurazione CORS è possibile specificare i valori indicati di seguito per l'elemento `AllowedMethods`.
+ GET
+ PUT
+ POST
+ DELETE
+ HEAD

## Elemento `AllowedOrigins`
<a name="cors-allowed-origin"></a>

Nell'elemento `AllowedOrigins`, è possibile specificare le origini da cui si desiderano consentire le richieste multidominio, ad esempio` http://www.example.com`. La stringa di origine può contenere solamente un carattere jolly `*`, ad esempio `http://*.example.com`. Se si desidera, è possibile specificare `*` come origine per consentire a tutte le origini di inviare richieste multiorigine. È anche possibile specificare `https` per abilitare solo le origini sicure.

## Elemento `AllowedHeaders`
<a name="cors-allowed-headers"></a>

L'elemento `AllowedHeaders` specifica le intestazioni consentite in una richiesta preliminare tramite l'intestazione `Access-Control-Request-Headers`. Ogni nome di intestazione in `Access-Control-Request-Headers` deve corrispondere a una voce nell'elemento. Tra le intestazioni richieste, Amazon S3 invierà nella risposta solo quelle consentite. Per un esempio di elenco di intestazioni che possono essere utilizzate nelle richieste ad Amazon S3, consulta l'argomento relativo alle [intestazioni di richiesta comuni](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonRequestHeaders.html) nella *Documentazione di riferimento delle API di Amazon Simple Storage Service*.

Ogni AllowedHeaders stringa nella configurazione può contenere al massimo un carattere jolly (\$1). Ad esempio, `<AllowedHeader>x-amz-*</AllowedHeader>` abiliterà tutte le intestazioni specifiche di Amazon.

## Elemento `ExposeHeaders`
<a name="cors-expose-headers"></a>

Ogni `ExposeHeader` elemento identifica un'intestazione nella risposta a cui desideri che i clienti possano accedere dalle loro applicazioni (ad esempio, da un JavaScript `XMLHttpRequest` oggetto). Per un elenco delle intestazioni di risposta più comuni di Amazon S3, consulta l'argomento relativo alle [intestazioni di richiesta comuni](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonResponseHeaders.html) nella *Documentazione di riferimento delle API di Amazon Simple Storage Service*.

## Elemento `MaxAgeSeconds`
<a name="cors-max-age"></a>

L'elemento `MaxAgeSeconds` specifica l'intervallo di tempo in secondi durante il quale il browser può memorizzare nella cache la risposta a una richiesta preliminare identificata in base a risorsa, metodo HTTP e origine.

## Esempi di configurazioni CORS
<a name="cors-example-1"></a>

Anziché accedere a un sito Web utilizzando un endpoint del sito Web Amazon S3, è possibile utilizzare il proprio dominio, come `example1.com`, per consegnare il contenuto. Per informazioni sull'uso del proprio dominio, consulta [Tutorial: Configurazione di un sito Web statico utilizzando un dominio personalizzato registrato con Route 53](website-hosting-custom-domain-walkthrough.md). 

La configurazione CORS di esempio riportata di seguito include tre regole, specificate come elementi `CORSRule`:
+ La prima regola consente le richieste multiorigine PUT, POST e DELETE provenienti dall'origine `http://www.example1.com` La regole consente inoltre tutte le intestazioni in una richiesta OPTIONS preliminare tramite l'intestazione `Access-Control-Request-Headers`. In risposta alle richieste OPTIONS preliminari, Amazon S3 restituisce le intestazioni richieste.
+ La seconda regola consente le stesse richieste multiorigine della prima regola, ma si applica a un'altra origine, `http://www.example2.com`. 
+ La terza regola consente le richieste multiorigine GET provenienti da tutte le origini. Il carattere jolly `*` si riferisce a tutte le origini. 

------
#### [ JSON ]

```
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "http://www.example1.com"
        ],
        "ExposeHeaders": []
    },
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "http://www.example2.com"
        ],
        "ExposeHeaders": []
    },
    {
        "AllowedHeaders": [],
        "AllowedMethods": [
            "GET"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]
```

------
#### [ XML ]

```
<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>http://www.example1.com</AllowedOrigin>

   <AllowedMethod>PUT</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>DELETE</AllowedMethod>

   <AllowedHeader>*</AllowedHeader>
 </CORSRule>
 <CORSRule>
   <AllowedOrigin>http://www.example2.com</AllowedOrigin>

   <AllowedMethod>PUT</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>DELETE</AllowedMethod>

   <AllowedHeader>*</AllowedHeader>
 </CORSRule>
 <CORSRule>
   <AllowedOrigin>*</AllowedOrigin>
   <AllowedMethod>GET</AllowedMethod>
 </CORSRule>
</CORSConfiguration>
```

------

La configurazione CORS supporta anche i parametri di configurazione opzionali, come illustrato nella seguente configurazione CORS. In questo esempio la configurazione CORS consente le richieste multiorigine PUT, POST e DELETE provenienti dall'origine `http://www.example.com`.

------
#### [ JSON ]

```
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "http://www.example.com"
        ],
        "ExposeHeaders": [
            "x-amz-server-side-encryption",
            "x-amz-request-id",
            "x-amz-id-2"
        ],
        "MaxAgeSeconds": 3000
    }
]
```

------
#### [ XML ]

```
<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>http://www.example.com</AllowedOrigin>
   <AllowedMethod>PUT</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>DELETE</AllowedMethod>
   <AllowedHeader>*</AllowedHeader>
  <MaxAgeSeconds>3000</MaxAgeSeconds>
  <ExposeHeader>x-amz-server-side-encryption</ExposeHeader>
  <ExposeHeader>x-amz-request-id</ExposeHeader>
  <ExposeHeader>x-amz-id-2</ExposeHeader>
 </CORSRule>
</CORSConfiguration>
```

------

L'elemento `CORSRule` nella configurazione precedente include gli elementi opzionali riportati di seguito.
+ `MaxAgeSeconds` – Specifica l'intervallo di tempo in secondi (in questo esempio, 3000) durante il quale il browser memorizza nella cache una risposta Amazon S3 a una richiesta OPTIONS preliminare per la risorsa specificata. La memorizzazione nella cache della risposta consente al browser di non inviare richieste preliminari ad Amazon S3 se la richiesta originale viene ripetuta. 
+ `ExposeHeaders`—Identifica le intestazioni di risposta (in questo esempio, `x-amz-server-side-encryption``x-amz-request-id`, e`x-amz-id-2`) a cui i clienti possono accedere dalle loro applicazioni (ad esempio, da un oggetto). JavaScript `XMLHttpRequest`

# Configurazione della funzionalità Cross-Origin Resource Sharing (CORS)
<a name="enabling-cors-examples"></a>

La funzionalità CORS (Cross-Origin Resource Sharing, condivisione delle risorse multiorigine) definisce un metodo con cui le applicazioni Web dei clienti caricate in un dominio possono interagire con le risorse situate in un dominio differente. Con il supporto della funzionalità CORS, è possibile creare applicazioni Web lato client complete con Amazon S3 e concedere l'accesso multiorigine alle risorse di Amazon S3 in modo selettivo. 

Questa sezione mostra come abilitare CORS utilizzando la console Amazon S3, l'API REST di Amazon S3 e il. AWS SDKs Per configurare il bucket in modo da consentire richieste tra più origini, è necessario aggiungere una configurazione CORS al bucket. La configurazione CORS è un documento in cui sono definite regole che identificano le origini che potranno accedere al bucket, le operazioni (metodi HTTP) supportate per ogni origine e altre informazioni specifiche dell'operazione. Nella console S3, la configurazione CORS deve essere un documento JSON.

Per esempi di configurazioni CORS in JSON e XML, consulta [Elementi di una configurazione CORS](ManageCorsUsing.md).

## Utilizzo della console S3
<a name="add-cors-configuration"></a>

In questa sezione viene descritto come utilizzare la console di Amazon S3 per aggiungere una configurazione CORS (Cross-Origin Resource Sharing, condivisione delle risorse multiorigine) a un bucket S3. 

Quando abiliti CORS nel bucket, le liste di controllo degli accessi (ACLs) e le altre politiche di autorizzazione all'accesso continuano ad essere applicate.

**Importante**  
Nella console S3, la configurazione CORS deve essere JSON. Per esempi di configurazioni CORS in JSON e XML, consulta [Elementi di una configurazione CORS](ManageCorsUsing.md).

**Per aggiungere una configurazione CORS a un bucket S3**

1. Accedi a Console di gestione AWS e apri la console Amazon S3 all'indirizzo. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)

1. Nel riquadro di navigazione sinistro, scegli **Bucket per uso generico**.

1. Nell’elenco dei bucket, seleziona il nome del bucket per il quale desideri creare una policy di bucket.

1. Seleziona **Autorizzazioni**.

1. Nella sezione **Cross-Origin Resource Sharing (CORS)** scegliere **Edit (Modifica)**.

1. Nella casella di testo **CORS configuration editor (Editor configurazione CORS)**, digitare o copiare e incollare una nuova configurazione CORS oppure modificare una configurazione esistente.

   La configurazione CORS è un file JSON. Il testo digitato nell'editor deve essere in formato JSON valido. Per ulteriori informazioni, consulta [Elementi di una configurazione CORS](ManageCorsUsing.md).

1. Seleziona **Salva modifiche**.
**Nota**  
Amazon S3 visualizza l'Amazon Resource Name (ARN) per il bucket accanto al titolo **CORS configuration editor (Editor configurazione CORS)**. Per ulteriori informazioni su ARNs, consulta [Amazon Resource Names (ARNs) e AWS Service Namespaces](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) nel. *Riferimenti generali di Amazon Web Services*

## Usando il AWS SDKs
<a name="ManageCorsUsingSDK"></a>

È possibile utilizzare l' AWS SDK per gestire la condivisione di risorse tra origini diverse (CORS) per un bucket. Per ulteriori informazioni sulla funzionalità CORS, consulta [Utilizzo della funzionalità Cross-Origin Resource Sharing (CORS)](cors.md).

 Gli esempi seguenti:
+ Crea una configurazione CORS e imposta la configurazione su un bucket
+ Recupera la configurazione e la modifica aggiungendo una regola
+ Aggiunge la configurazione modificata al bucket
+ Elimina la configurazione

------
#### [ Java ]

**Example**  

**Example**  
 Per istruzioni su come creare e testare un esempio funzionante, consulta [Getting Started nella Developer Guide](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html). AWS SDK per Java   

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.BucketCrossOriginConfiguration;
import com.amazonaws.services.s3.model.CORSRule;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class CORS {

    public static void main(String[] args) throws IOException {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";

        // Create two CORS rules.
        List<CORSRule.AllowedMethods> rule1AM = new ArrayList<CORSRule.AllowedMethods>();
        rule1AM.add(CORSRule.AllowedMethods.PUT);
        rule1AM.add(CORSRule.AllowedMethods.POST);
        rule1AM.add(CORSRule.AllowedMethods.DELETE);
        CORSRule rule1 = new CORSRule().withId("CORSRule1").withAllowedMethods(rule1AM)
                .withAllowedOrigins(Arrays.asList("http://*.example.com"));

        List<CORSRule.AllowedMethods> rule2AM = new ArrayList<CORSRule.AllowedMethods>();
        rule2AM.add(CORSRule.AllowedMethods.GET);
        CORSRule rule2 = new CORSRule().withId("CORSRule2").withAllowedMethods(rule2AM)
                .withAllowedOrigins(Arrays.asList("*")).withMaxAgeSeconds(3000)
                .withExposedHeaders(Arrays.asList("x-amz-server-side-encryption"));

        List<CORSRule> rules = new ArrayList<CORSRule>();
        rules.add(rule1);
        rules.add(rule2);

        // Add the rules to a new CORS configuration.
        BucketCrossOriginConfiguration configuration = new BucketCrossOriginConfiguration();
        configuration.setRules(rules);

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(clientRegion)
                    .build();

            // Add the configuration to the bucket.
            s3Client.setBucketCrossOriginConfiguration(bucketName, configuration);

            // Retrieve and display the configuration.
            configuration = s3Client.getBucketCrossOriginConfiguration(bucketName);
            printCORSConfiguration(configuration);

            // Add another new rule.
            List<CORSRule.AllowedMethods> rule3AM = new ArrayList<CORSRule.AllowedMethods>();
            rule3AM.add(CORSRule.AllowedMethods.HEAD);
            CORSRule rule3 = new CORSRule().withId("CORSRule3").withAllowedMethods(rule3AM)
                    .withAllowedOrigins(Arrays.asList("http://www.example.com"));

            rules = configuration.getRules();
            rules.add(rule3);
            configuration.setRules(rules);
            s3Client.setBucketCrossOriginConfiguration(bucketName, configuration);

            // Verify that the new rule was added by checking the number of rules in the
            // configuration.
            configuration = s3Client.getBucketCrossOriginConfiguration(bucketName);
            System.out.println("Expected # of rules = 3, found " + configuration.getRules().size());

            // Delete the configuration.
            s3Client.deleteBucketCrossOriginConfiguration(bucketName);
            System.out.println("Removed CORS configuration.");

            // Retrieve and display the configuration to verify that it was
            // successfully deleted.
            configuration = s3Client.getBucketCrossOriginConfiguration(bucketName);
            printCORSConfiguration(configuration);
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }

    private static void printCORSConfiguration(BucketCrossOriginConfiguration configuration) {
        if (configuration == null) {
            System.out.println("Configuration is null.");
        } else {
            System.out.println("Configuration has " + configuration.getRules().size() + " rules\n");

            for (CORSRule rule : configuration.getRules()) {
                System.out.println("Rule ID: " + rule.getId());
                System.out.println("MaxAgeSeconds: " + rule.getMaxAgeSeconds());
                System.out.println("AllowedMethod: " + rule.getAllowedMethods());
                System.out.println("AllowedOrigins: " + rule.getAllowedOrigins());
                System.out.println("AllowedHeaders: " + rule.getAllowedHeaders());
                System.out.println("ExposeHeader: " + rule.getExposedHeaders());
                System.out.println();
            }
        }
    }
}
```

------
#### [ .NET ]

**Example**  
Per informazioni sulla configurazione e l'esecuzione degli esempi di codice, consulta [Getting Started with the AWS SDK for .NET nella AWS SDK for](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html) .NET *Developer Guide*.   

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class CORSTest
    {
        private const string bucketName = "*** bucket name ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; 
        private static IAmazonS3 s3Client;

        public static void Main()
        {
            s3Client = new AmazonS3Client(bucketRegion);
            CORSConfigTestAsync().Wait();
        }
        private static async Task CORSConfigTestAsync()
        {
            try
            {
                // Create a new configuration request and add two rules    
                CORSConfiguration configuration = new CORSConfiguration
                {
                    Rules = new System.Collections.Generic.List<CORSRule>
                        {
                          new CORSRule
                          {
                            Id = "CORSRule1",
                            AllowedMethods = new List<string> {"PUT", "POST", "DELETE"},
                            AllowedOrigins = new List<string> {"http://*.example.com"}
                          },
                          new CORSRule
                          {
                            Id = "CORSRule2",
                            AllowedMethods = new List<string> {"GET"},
                            AllowedOrigins = new List<string> {"*"},
                            MaxAgeSeconds = 3000,
                            ExposeHeaders = new List<string> {"x-amz-server-side-encryption"}
                          }
                        }
                };

                // Add the configuration to the bucket. 
                await PutCORSConfigurationAsync(configuration);

                // Retrieve an existing configuration. 
                configuration = await RetrieveCORSConfigurationAsync();

                // Add a new rule.
                configuration.Rules.Add(new CORSRule
                {
                    Id = "CORSRule3",
                    AllowedMethods = new List<string> { "HEAD" },
                    AllowedOrigins = new List<string> { "http://www.example.com" }
                });

                // Add the configuration to the bucket. 
                await PutCORSConfigurationAsync(configuration);

                // Verify that there are now three rules.
                configuration = await RetrieveCORSConfigurationAsync();
                Console.WriteLine();
                Console.WriteLine("Expected # of rulest=3; found:{0}", configuration.Rules.Count);
                Console.WriteLine();
                Console.WriteLine("Pause before configuration delete. To continue, click Enter...");
                Console.ReadKey();

                // Delete the configuration.
                await DeleteCORSConfigurationAsync();

                // Retrieve a nonexistent configuration.
                configuration = await RetrieveCORSConfigurationAsync();
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }

        static async Task PutCORSConfigurationAsync(CORSConfiguration configuration)
        {

            PutCORSConfigurationRequest request = new PutCORSConfigurationRequest
            {
                BucketName = bucketName,
                Configuration = configuration
            };

            var response = await s3Client.PutCORSConfigurationAsync(request);
        }

        static async Task<CORSConfiguration> RetrieveCORSConfigurationAsync()
        {
            GetCORSConfigurationRequest request = new GetCORSConfigurationRequest
            {
                BucketName = bucketName

            };
            var response = await s3Client.GetCORSConfigurationAsync(request);
            var configuration = response.Configuration;
            PrintCORSRules(configuration);
            return configuration;
        }

        static async Task DeleteCORSConfigurationAsync()
        {
            DeleteCORSConfigurationRequest request = new DeleteCORSConfigurationRequest
            {
                BucketName = bucketName
            };
            await s3Client.DeleteCORSConfigurationAsync(request);
        }

        static void PrintCORSRules(CORSConfiguration configuration)
        {
            Console.WriteLine();

            if (configuration == null)
            {
                Console.WriteLine("\nConfiguration is null");
                return;
            }

            Console.WriteLine("Configuration has {0} rules:", configuration.Rules.Count);
            foreach (CORSRule rule in configuration.Rules)
            {
                Console.WriteLine("Rule ID: {0}", rule.Id);
                Console.WriteLine("MaxAgeSeconds: {0}", rule.MaxAgeSeconds);
                Console.WriteLine("AllowedMethod: {0}", string.Join(", ", rule.AllowedMethods.ToArray()));
                Console.WriteLine("AllowedOrigins: {0}", string.Join(", ", rule.AllowedOrigins.ToArray()));
                Console.WriteLine("AllowedHeaders: {0}", string.Join(", ", rule.AllowedHeaders.ToArray()));
                Console.WriteLine("ExposeHeader: {0}", string.Join(", ", rule.ExposeHeaders.ToArray()));
            }
        }
    }
}
```

------

## Utilizzo della REST API
<a name="EnableCorsUsingREST"></a>

Per impostare una configurazione CORS nel bucket, è possibile utilizzare la Console di gestione AWS. Se l'applicazione lo richiede, si può inoltre inviare le richieste REST direttamente. Le sezioni seguenti della *Documentazione d riferimento delle API di Amazon Simple Storage Service* descrivono le operazioni di REST API correlate alla configurazione CORS. 
+ [PutBucketCors](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTcors.html)
+ [GetBucketCors](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETcors.html)
+ [DeleteBucketCors](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketDELETEcors.html)
+ [OPTIONS object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTOPTIONSobject.html)

# Test di CORS
<a name="testing-cors"></a>

Per testare la configurazione CORS, è possibile inviare una richiesta di verifica CORS con il metodo `OPTIONS` in modo che il server possa rispondere se l'invio della richiesta è accettabile. Quando Amazon S3 riceve una richiesta di verifica, S3 valuta la configurazione CORS per il bucket e utilizza la prima regola `CORSRule` corrispondente alla richiesta in entrata per abilitare una richiesta multiorigine. Per garantire la corrispondenza tra la regola e la richiesta, è necessario che siano soddisfatte le condizioni elencate di seguito. 
+ L'intestazione `Origin` di una richiesta CORS al bucket deve corrispondere alle origini dell'elemento `AllowedOrigins` nella configurazione CORS.
+ I metodi HTTP specificati in `Access-Control-Request-Method` in una richiesta CORS al bucket devono corrispondere al metodo o ai metodi elencati nell'elemento `AllowedMethods` della configurazione CORS.
+ Le intestazioni elencate nell'intestazione `Access-Control-Request-Headers` di una richiesta di verifica devono corrispondere alle intestazioni dell'elemento `AllowedHeaders` nella configurazione CORS. 

Di seguito è riportato un esempio di configurazione CORS. Per creare una configurazione CORS, consulta [Configurazione di CORS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html). Per altri esempi di configurazione CORS, consulta [Elementi di una configurazione CORS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html). 

Per indicazioni sulla configurazione delle regole CORS e sulla relativa risoluzione dei problemi, consulta [Come faccio a configurare CORS in Amazon S3 e confermare le regole CORS utilizzando cURL?](https://repost.aws/knowledge-center/s3-configure-cors) nel Knowledge Center di AWS re:Post.

------
#### [ JSON ]

```
[
    {
        "AllowedHeaders": [
            "Authorization"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "http://www.example1.com"
        ],
        "ExposeHeaders":  [
             "x-amz-meta-custom-header"
        ]
    
    }
]
```

------

Per testare la configurazione CORS, è possibile inviare un controllo `OPTIONS` di verifica utilizzando il seguente comando CURL. CURL è uno strumento da riga di comando che può essere usato per interagire con S3. Per ulteriori informazioni, consulta [CURL](https://curl.se/). 

```
 curl -v -X OPTIONS \
  -H "Origin: http://www.example1.com" \
  -H "Access-Control-Request-Method: PUT" \
  -H "Access-Control-Request-Headers: Authorization" \
  -H "Access-Control-Expose-Headers: x-amz-meta-custom-header"\
     "http://bucket_name.s3.amazonaws.com/object_prefix_name"
```

Nell'esempio precedente, il comando `curl -v -x OPTIONS` viene utilizzato per inviare una richiesta di verifica a S3 per chiedere se S3 consente di inviare una richiesta `PUT` su un oggetto dall'origine incrociata `http://www.example1.com`. Le intestazioni `Access-Control-Request-Headers` e `Access-Control-Expose-Headers` sono opzionali.
+ In risposta all'intestazione `Access-Control-Request-Method` della richiesta `OPTIONS` di verifica, Amazon S3 restituisce l'elenco dei metodi consentiti se i metodi richiesti corrispondono. 
+ In risposta all'intestazione `Access-Control-Request-Headers` della richiesta `OPTIONS` di verifica, Amazon S3 restituisce l'elenco delle intestazioni consentite se le intestazioni richieste corrispondono.
+ In risposta all'intestazione `Access-Control-Expose-Headers` della richiesta `OPTIONS` di verifica, Amazon S3 restituisce un elenco di intestazioni consentite se le intestazioni richieste corrispondono alle intestazioni consentite a cui possono accedere gli script in esecuzione nel browser.

**Nota**  
Quando si invia una richiesta di verifica, se una delle intestazioni della richiesta CORS non è consentita, non viene restituita nessuna delle intestazioni CORS della risposta.

In risposta a questa richiesta `OPTIONS` di verifica, riceverai una risposta `200 OK`. Per i codici di errore più comuni ricevuti durante il test di CORS e per ulteriori informazioni per risolvere i problemi relativi a CORS, consulta [Risoluzione dei problemi di CORS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/cors-troubleshooting.html). 

```
< HTTP/1.1 200 OK
< Date: Fri, 12 Jul 2024 00:23:51 GMT
< Access-Control-Allow-Origin: http://www.example1.com
< Access-Control-Allow-Methods: GET, PUT, POST, DELETE 
< Access-Control-Allow-Headers: Authorization
< Access-Control-Expose-Headers: x-amz-meta-custom-header
< Access-Control-Allow-Credentials: true
< Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
< Server: AmazonS3
< Content-Length: 0
```

# Risoluzione dei problemi di CORS
<a name="cors-troubleshooting"></a>

I seguenti argomenti sono utili per risolvere alcuni problemi CORS comuni relativi a S3.

**Topics**
+ [Errore 403 Accesso negato: CORS non è abilitato per questo bucket](#cors-not-enabled)
+ [Errore 403 Accesso negato: questa richiesta CORS non è consentita](#cors-not-enabled)
+ [Intestazioni non trovate nella risposta CORS](#Headers-not-found)
+ [Considerazioni su CORS nelle integrazioni proxy S3](#cors-in-proxy)

## Errore 403 Accesso negato: CORS non è abilitato per questo bucket
<a name="cors-not-enabled"></a>

Il seguente errore `403 Forbidden` si verifica quando viene inviata una richiesta multiorigine ad Amazon S3 ma CORS non è configurato sul bucket S3. 

 Errore: HTTP/1.1 403 Accesso negato Risposta CORS: CORS non è abilitato per questo bucket. 

La configurazione CORS è un documento o una policy con regole che identificano le origini che potranno accedere al bucket, le operazioni (metodi HTTP) supportate per ogni origine e altre informazioni specifiche dell'operazione. Scopri come [configurare CORS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html) su S3 utilizzando la console AWS SDKs Amazon S3 e l'API REST. Per ulteriori informazioni su CORS ed esempi di configurazione CORS, consulta [Elementi di CORS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html#cors-example-1).

## Errore 403 Accesso negato: questa richiesta CORS non è consentita
<a name="cors-not-enabled"></a>

Il seguente errore `403 Forbidden` viene ricevuto quando una regola CORS nella configurazione CORS non corrisponde ai dati nella richiesta.

Errore: HTTP/1.1 403 Accesso negato Risposta CORS: questa richiesta CORS non è consentita.

Di conseguenza, questo errore `403 Forbidden` può verificarsi per diversi motivi:
+ L'origine non è consentita.
+ I metodi non sono consentiti.
+ Le intestazione richieste non sono consentite.

Per ogni richiesta ricevuta da Amazon S3, è necessario disporre di una regola CORS nella configurazione CORS che corrisponda ai dati nella richiesta. 

### L'origine non è consentita
<a name="Origin-not-allowed"></a>

 L'intestazione `Origin` di una richiesta CORS al bucket deve corrispondere alle origini dell'elemento `AllowedOrigins` nella configurazione CORS. Un carattere jolly (`"*"`) nell'elemento `AllowedOrigins` corrisponderà a tutti i metodi HTTP. Per ulteriori informazioni su come aggiornare l'elemento `AllowedOrigins`, consulta [Configuring cross-origin resource sharing (CORS)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html).

 Ad esempio, se nell'elemento `AllowedOrigins` è incluso solo il dominio `http://www.example1.com`, una richiesta CORS inviata dal dominio `http://www.example2.com` riceverà l'errore `403 Forbidden`. 

L'esempio seguente mostra parte di una configurazione CORS che include il dominio `http://www.example1.com` nell'elemento `AllowedOrigins`. 

```
"AllowedOrigins":[
   "http://www.example1.com"
]
```

Affinché una richiesta CORS inviata dal dominio `http://www.example2.com` abbia esito positivo, il dominio `http://www.example2.com` deve essere incluso nell'elemento `AllowedOrigins` di configurazione CORS. 

```
"AllowedOrigins":[
   "http://www.example1.com"
   "http://www.example2.com"
]
```

### I metodi non sono consentiti
<a name="Methods-not-allowed"></a>

 I metodi HTTP specificati in `Access-Control-Request-Method` in una richiesta CORS al bucket devono corrispondere al metodo o ai metodi elencati nell'elemento `AllowedMethods` della configurazione CORS. Un carattere jolly (`"*"`) in `AllowedMethods` corrisponderà a tutti i metodi HTTP. Per ulteriori informazioni su come aggiornare l'elemento `AllowedOrigins`, consulta [Configuring cross-origin resource sharing (CORS)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html). 

Nella configurazione CORS è possibile specificare i metodi seguenti nell'elemento `AllowedMethods`:
+ `GET`
+ `PUT`
+ `POST`
+ `DELETE`
+ `HEAD`

L'esempio seguente mostra parte di una configurazione CORS che include il metodo `GET` nell'elemento `AllowedMethods`. Solo le richieste che includono il metodo `GET` avranno esito positivo. 

```
"AllowedMethods":[
   "GET"
]
```

 Se un metodo HTTP (ad esempio, `PUT`) è stato utilizzato in una richiesta CORS o incluso in una richiesta di verifica CORS al bucket ma il metodo non è presente nella configurazione CORS, la richiesta genererà un errore `403 Forbidden`. Per consentire questa richiesta CORS o richiesta di verifica CORS, il metodo `PUT` deve essere aggiunto alla configurazione CORS. 

```
"AllowedMethods":[
   "GET"
   "PUT"
]
```

### Le intestazione richieste non sono consentite
<a name="Headers-not-allowed"></a>

 Le intestazioni elencate nell'intestazione `Access-Control-Request-Headers` di una richiesta di verifica devono corrispondere alle intestazioni dell'elemento `AllowedHeaders` nella configurazione CORS. Per un elenco di intestazioni comuni che possono essere utilizzate nelle richieste ad Amazon S3, consulta [Common Request Headers](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonRequestHeaders.html). Per ulteriori informazioni su come aggiornare l'elemento `AllowedHeaders`, consulta [Configuring cross-origin resource sharing (CORS)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html). 

L'esempio seguente mostra parte di una configurazione CORS che include l'intestazione `Authorization` nell'elemento `AllowedHeaders`. Solo le richieste per l'intestazione `Authorization` avranno esito positivo. 

```
"AllowedHeaders":  [
    "Authorization"
]
```

 Se un'intestazione (ad esempio, `Content-MD5`) è stata inclusa in una richiesta CORS ma l'intestazione non è presente nella configurazione CORS, la richiesta genererà un errore `403 Forbidden`. Per consentire questa richiesta CORS, l'intestazione `Content-MD5` deve essere aggiunta alla configurazione CORS. Se si desidera passare entrambe le intestazioni `Authorization` e `Content-MD5` in una richiesta CORS al bucket, verificare che entrambe le intestazioni siano incluse nell'elemento `AllowedHeaders` della configurazione CORS. 

```
"AllowedHeaders":  [
    "Authorization"
    "Content-MD5"
]
```

## Intestazioni non trovate nella risposta CORS
<a name="Headers-not-found"></a>

 L'elemento `ExposeHeaders` nella configurazione CORS identifica le intestazioni di risposta che si desidera rendere accessibili agli script e alle applicazioni in esecuzione nei browser, in risposta a una richiesta CORS.

Se gli oggetti archiviati nel bucket S3 contengono metadati definiti dall'utente (ad esempio`x-amz-meta-custom-header`) oltre ai dati di risposta, questa intestazione personalizzata potrebbe contenere metadati o informazioni aggiuntivi a cui desideri accedere dal codice lato client. JavaScript Tuttavia, per impostazione predefinita, i browser bloccano l'accesso alle intestazioni personalizzate per motivi di sicurezza. Per consentire al lato client di accedere alle intestazioni personalizzate, JavaScript è necessario includere l'intestazione nella configurazione CORS.

 Nell'esempio seguente, l'intestazione `x-amz-meta-custom-header1` è inclusa nell'elemento `ExposeHeaders`. `x-amz-meta-custom-header2` non è incluso nell'elemento `ExposeHeaders` e manca nella configurazione CORS. Nella risposta, verranno restituiti solo i valori inclusi nell'elemento`ExposeHeaders`. Se la richiesta includesse l'intestazione `x-amz-meta-custom-header2` nell'intestazione `Access-Control-Expose-Headers`, la risposta restituirebbe comunque `200 OK`. Tuttavia, solo l'intestazione consentita, ad esempio `x-amz-meta-custom-header`, verrà restituita e mostrata nella risposta. 

```
"ExposeHeaders":  [
    "x-amz-meta-custom-header1"
]
```

 Per garantire che tutte le intestazioni vengano visualizzate nella risposta, aggiungi tutte le intestazioni consentite all'elemento `ExposeHeaders` nella configurazione CORS come mostrato di seguito. 

```
"ExposeHeaders":  [
    "x-amz-meta-custom-header1",
    "x-amz-meta-custom-header2"
]
```

## Considerazioni su CORS nelle integrazioni proxy S3
<a name="cors-in-proxy"></a>

Se riscontrate errori e avete già controllato la configurazione CORS sul vostro bucket S3 e la richiesta multiorigine viene inviata a proxy come, provate quanto segue: AWS CloudFront
+ Configurare le impostazioni per consentire il metodo `OPTIONS` per le richieste HTTP.
+ Configurare il proxy per inoltrare le seguenti intestazioni: `Origin`, `Access-Control-Request-Headers` e `Access-Control-Request-Method`.
+ Configurare le impostazioni del proxy in modo da includere l’intestazione di origine nella relativa chiave di cache. Questo è importante perché i proxy di caching che non includono l’intestazione di origine nella loro chiave di cache potrebbero restituire risposte memorizzate che non contengono le intestazioni CORS appropriate per le diverse origini.

Alcuni proxy forniscono funzionalità predefinite per le richieste CORS. Ad esempio, in CloudFront, puoi configurare una politica che includa le intestazioni 

 che abilitano le richieste CORS (Cross-Origin Resource Sharing) quando l'origine è un bucket Amazon S3.

 Questa policy ha le seguenti impostazioni: 
+ Intestazioni incluse nelle richieste di origine:

   `Origin`

   `Access-Control-Request-Headers`

   `Access-Control-Request-Method`
+ **Cookie inclusi nelle richieste di origine:** Nessuno
+ Stringhe di query incluse nelle richieste di origine: Nessuna

Per ulteriori informazioni, consulta [Controllare le richieste di origine con una policy](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/controlling-origin-requests.htm) e [Use managed Origin Request Policy](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html#managed-origin-request-policy-cors-s3) nella *CloudFront Developer Guide*. 