Làm cách nào để thiết lập CORS?


12

Drupal 8 có dịch vụ web RESTful được xây dựng trong lõi và kể từ 8.2, chúng tôi không cần mô-đun cors .

Bây giờ để sử dụng các dịch vụ, chúng tôi chỉ cần kích hoạt và định cấu hình tệp default.service.yml như được chỉ định ở đây

Tuy nhiên, tôi không thể định cấu hình thiết lập này để cho phép truy cập dịch vụ web qua một tên miền khác.

Thiết lập service.yml hiện tại của tôi cho cors là:

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

Tôi googled để tìm cấu hình chi tiết hơn về điều này nhưng không thể tìm thấy một.

Tôi đang tạo điều này để phát triển thử nghiệm trên hai miền khác nhau.

Sử dụng môi trường dev pantheon cho các dịch vụ web và tên miền .dev tùy chỉnh localhost để tiêu thụ các dịch vụ đó.

Truy cập dịch vụ hoạt động tốt bằng cách sử dụng tiện ích mở rộng chrome CORS.


Nếu bạn đã thay đổi trang web / default / services.yml như đã nói trong các câu trả lời trước đó và nó không hoạt động, hãy đảm bảo rằng CORS được bật trong máy chủ web của bạn. Ví dụ: trong Nginx, bạn phải thêm / sửa đổi một vị trí trong cấu hình khối máy chủ của mình, xem https://enable-cors.org/server_nginx.html
Ghim

Câu trả lời:


16

Tôi đã gặp vấn đề này gần đây trên Pantheon và hy vọng điều này sẽ giúp ích nếu bạn chưa giải quyết nó.

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

Một vài điều cần lưu ý ...

Về vị trí của tệp trên Pantheon, vui lòng đảm bảo rằng tệp service.yml của bạn nằm trong / sites / default so với just / sites. Tôi đã sai theo ấn tượng nó sẽ làm việc từ cả hai nơi. Nó sẽ chỉ hoạt động nếu trong thư mục / sites / default.

Lưu ý danh sách được cho phép được phân tách bằng dấu phẩy mỗi bộ trong dấu ngoặc kép của riêng chúng. Ban đầu tôi có một chuỗi giống như bạn làm trong ví dụ của bạn ở trên và nó đã thất bại vô số lần trước khi tôi bắt được sự khác biệt tinh tế. Tôi khá chắc chắn cho phépMethod hoạt động theo cùng một cách nếu bạn đặc biệt muốn liệt kê ra các phương thức của mình.

Cũng xin lưu ý rằng mặc dù đoạn mã của tôi sẽ hoạt động tốt để phát triển dựa trên hộp cát Pantheon, bạn có thể sẽ muốn khóa mọi thứ thêm một chút trước khi đi vào sản xuất. Với việc cung cấp HTTPS của Pantheon, bạn cũng sẽ muốn đảm bảo sử dụng nó nếu bạn sẽ chuyển thông tin xung quanh thông qua các tiêu đề. Hy vọng điều này sẽ giúp ích cho bạn nếu bạn vẫn gặp sự cố hoặc ai đó khác vấp phải nó trên đường.


4
Tại sao chỉ định allowOrigins và sau đó cũng vượt qua '*'?
Christian

Đơn giản chỉ để hiển thị cả hai tùy chọn. Xin vui lòng bỏ qua cái này hay cái khác.
Shawn Matthews

phơi sángHeaders nên sai hoặc một mảng, mỗi drupal.org/project/drupal/issues/2905848
John

Nếu bất cứ ai quan tâm, tôi không tin rằng trường allowOrigins chấp nhận regex. Tôi đã thử sử dụng một mẫu biểu thức chính quy để đưa vào danh sách trắng nhiều tên miền phụ và drupal đã phàn nàn. Tôi đã phải sử dụng một danh sách rõ ràng các tên miền, được phân tách bằng dấu phẩy, như trong ví dụ này. Tôi đã hy vọng nó sẽ hoạt động giống như cài đặt máy chủ đáng tin cậy trong cài
đặt.php

9

Tìm: ... / site / default / default.service.yml

Tạo một bản sao và đổi tên bản sao thành:

... / Trang web / mặc định / services.yml

Tìm phần này của mã: cors.config: enable: false

và thay thế bằng dòng sau - cors.config: enable: true

Xóa bộ nhớ cache.


Tôi nên thử tất cả mọi thứ cho đến khi thấy câu trả lời của bạn, cảm ơn vì đã cho thấy điểm quan trọng nhất đó là TÌM HIỂU CACHE (REBUILD CACHE): D
emy

3

Các thiết lập sau đây làm việc cho tôi.

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

0

phơi bàyHeaders: true không hợp lệ và sẽ gây ra Cảnh báo: implode (): Các đối số không hợp lệ được truyền trong Asm89 \ Stack \ CorsService-> addActualRequestHeaders () (dòng 94 của / eller / asm89 / stack-cors / src / Asm89 / Stack / CorsService. php) # 0 /web/core/includes/bootstrap.inc(584) Nó cần phải là sai hoặc một mảng với các tiêu đề được phép hiển thị, xem https://developer.mozilla.org/en-US/docs/Web/ HTTP / Headers / Access-Control-Expose-Headers

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.