Come posso impostare CORS?


12

Drupal 8 ha un servizio web RESTful integrato nel core e da 8.2 non abbiamo bisogno del modulo cors .

Ora per usare i servizi abilitiamo e configuriamo il file default.service.yml come specificato qui

Tuttavia, non sono stato in grado di configurare questa configurazione per consentire l'accesso al servizio Web su un altro dominio.

La mia configurazione attuale di service.yml per cors è:

cors.config:
    enabled: true
    # Specify allowed headers, like 'x-allowed-header'.
    allowedHeaders: ['x-csrf-token,authorization,content-type,accept,origin,x-requested-with']
    # Specify allowed request methods, specify ['*'] to allow all possible ones.
    allowedMethods: ['POST, GET, OPTIONS, DELETE, PUT']
    # Configure requests allowed from specific origins.
    allowedOrigins: ['*']
    # Sets the Access-Control-Expose-Headers header.
    exposedHeaders: false
    # Sets the Access-Control-Max-Age header.
    maxAge: 1000
    # Sets the Access-Control-Allow-Credentials header.
    supportsCredentials: false

Ho cercato su Google di trovare ulteriori configurazioni dettagliate su questo, ma non sono riuscito a trovarne uno.

Sto creando questo per lo sviluppo di test in due domini diversi.

Utilizzo dell'ambiente di sviluppo pantheon per servizi Web e dominio .dev personalizzato localhost per l'utilizzo di tali servizi.

L'accesso al servizio funziona correttamente utilizzando l'estensione CORS cromata.


Se hai già modificato il tuo sito / default / services.yml come indicato nelle risposte precedenti e non ha funzionato, assicurati che CORS sia abilitato nel tuo server web. Ad esempio, in Nginx devi aggiungere / modificare una posizione nella configurazione del tuo blocco server, vedi https://enable-cors.org/server_nginx.html
Pin

Risposte:


16

Mi sono imbattuto recentemente in Pantheon, e spero che questo aiuti se non l'hai già risolto.

cors.config:
    enabled: true
    # Specify allowed headers, like 'x-allowed-header'.
    allowedHeaders: ['x-csrf-token','authorization','content-type','accept','origin','x-requested-with', 'access-control-allow-origin','x-allowed-header','*']
    # Specify allowed request methods, specify ['*'] to allow all possible ones.
    allowedMethods: ['*']
    # Configure requests allowed from specific origins.
    allowedOrigins: ['http://localhost/','http://localhost:3000','http://localhost:3001','http://localhost:3002','*']
    # Sets the Access-Control-Expose-Headers header.
    exposedHeaders: false
    # Sets the Access-Control-Max-Age header.
    maxAge: false
    # Sets the Access-Control-Allow-Credentials header.
    supportsCredentials: true

Alcune cose da notare ...

Per quanto riguarda la posizione del file su Pantheon, assicurati che il tuo file service.yml sia in / sites / default vs just / sites. Avevo erroneamente l'impressione che avrebbe funzionato da entrambi i posti. Funzionerà solo se nella directory / sites / default.

Si noti l'elenco separato da virgole di consentitiHeader ciascuno nel proprio set di virgolette. Inizialmente avevo una singola stringa come te nel tuo esempio sopra, e ha fallito innumerevoli volte prima di cogliere la sottile differenza. Sono abbastanza sicuro che i metodi funzionano allo stesso modo se si desidera elencare specificamente i metodi.

Nota anche che mentre il mio frammento di codice funzionerà bene per lo sviluppo su un sandbox Pantheon, probabilmente vorrai bloccare un po 'di più le cose prima di entrare in produzione. Con Pantheon che offre HTTPS, dovrai anche assicurarti di usarlo se stai per passare informazioni attraverso le intestazioni. Spero che questo ti aiuti se hai ancora problemi o qualcun altro che si è imbattuto su di esso lungo la strada.


4
Perché specificare Origini consentiti e quindi passare anche '*'?
Christian,

Semplicemente per mostrare entrambe le opzioni. Sentiti libero di omettere l'uno o l'altro.
Shawn Matthews,

exposHeaders dovrebbe essere falso o un array, per drupal.org/project/drupal/issues/2905848
John

Se qualcuno è interessato, non credo che il campo consentitoOrigins accetti regex. Ho provato a usare un modello regex per autorizzare più sottodomini e Drupal si è lamentato. Ho dovuto usare un elenco esplicito di domini, separati da virgola, come in questo esempio. Speravo che si sarebbe comportato come l'impostazione di host fidati in settings.php
Tony Stecca,

9

Trova: ... / sites / default / default.services.yml

Crea una copia e rinomina la copia in:

... / sites / default / services.yml

Trova questa parte del codice: cors.config: enabled: false

e sostituisci con il seguente - cors.config: enabled: true

Cancella la cache.


Ho supposto di aver provato tutto fino a quando non ho visto la tua risposta, grazie per aver mostrato il punto più importante che è CANCELLARE IL CACHE (RICOSTRUIRE CACHE): D
emy

3

La seguente impostazione funziona per me.

cors.config:
  enabled: true
  # Specify allowed headers, like 'x-allowed-header'.
  allowedHeaders: ['x-csrf-token','authorization','content-type','accept','origin','x-requested-with']
  # Specify allowed request methods, specify ['*'] to allow all possible ones.
  allowedMethods: ['*']
  # Configure requests allowed from specific origins.
  allowedOrigins: ['*']
  # Sets the Access-Control-Expose-Headers header.
  exposedHeaders: false
  # Sets the Access-Control-Max-Age header.
  maxAge: false
  # Sets the Access-Control-Allow-Credentials header.
  supportsCredentials: false

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.