1412 Stimmen

Access-Control-Allow-Origin Multiple Origin Domains?

Gibt es eine Möglichkeit, mehrere Cross-Domains zuzulassen, indem man die Access-Control-Allow-Origin Kopfzeile?

Ich bin mir bewusst, dass die * aber sie ist zu offen. Ich möchte wirklich nur ein paar Domänen zulassen.

Ein Beispiel dafür ist Folgendes:

Access-Control-Allow-Origin: http://domain1.example, http://domain2.example

Ich habe den obigen Code ausprobiert, aber er scheint in Firefox nicht zu funktionieren.

Ist es möglich, mehrere Domänen anzugeben, oder muss ich mich auf eine beschränken?

24voto

George Punkte 5828

Für mehrere Domänen, in Ihrem .htaccess :

<IfModule mod_headers.c>
    SetEnvIf Origin "http(s)?://(www\.)?(domain1.example|domain2.example)$" AccessControlAllowOrigin=$0$1
    Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
    Header set Access-Control-Allow-Credentials true
</IfModule>

17voto

duvo Punkte 1564

Hier ist eine Lösung für eine Java-Webanwendung, basierend auf der Antwort von yesthatguy.

Ich verwende Jersey REST 1.x

Konfigurieren Sie die web.xml so, dass Jersey REST und der CORSResponseFilter bekannt sind

<!-- Jersey REST config -->
<servlet>
  <servlet-name>JAX-RS Servlet</servlet-name>
  <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
  <init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
    <param-value>com.your.package.CORSResponseFilter</param-value>
  </init-param>
  <init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>com.your.package</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>JAX-RS Servlet</servlet-name>
  <url-pattern>/ws/*</url-pattern>
</servlet-mapping>

Hier ist der Code für CORSResponseFilter

import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;

public class CORSResponseFilter implements ContainerResponseFilter{

    @Override
    public ContainerResponse filter(ContainerRequest request,
            ContainerResponse response) {

        String[] allowDomain = {"http://localhost:9000","https://my.domain.example"};
        Set<String> allowedOrigins = new HashSet<String>(Arrays.asList (allowDomain));                  

        String originHeader = request.getHeaderValue("Origin");

        if(allowedOrigins.contains(originHeader)) {
            response.getHttpHeaders().add("Access-Control-Allow-Origin", originHeader);

            response.getHttpHeaders().add("Access-Control-Allow-Headers",
                    "origin, content-type, accept, authorization");
            response.getHttpHeaders().add("Access-Control-Allow-Credentials", "true");
            response.getHttpHeaders().add("Access-Control-Allow-Methods",
                    "GET, POST, PUT, DELETE, OPTIONS, HEAD");
        }

        return response;
    }
}

16voto

Paco Zarate Punkte 1795

Für IIS 7.5+ mit installiertem URL Rewrite 2.0 Modul, siehe diese SO-Antwort

11voto

drAlberT Punkte 20376

Vielleicht irre ich mich, aber soweit ich sehen kann Access-Control-Allow-Origin hat eine "origin-list" als Parameter.

Unter Definition eine origin-list ist:

origin            = "origin" ":" 1*WSP [ "null" / origin-list ]
origin-list       = serialized-origin *( 1*WSP serialized-origin )
serialized-origin = scheme "://" host [ ":" port ]
                  ; <scheme>, <host>, <port> productions from RFC3986

Und davon ausgehend argumentiere ich, dass unterschiedliche Ursprünge zulässig sind und sein sollten räumlich getrennt .

9voto

Liakos Punkte 374

PHP-Code:

$httpOrigin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : null;
if (in_array($httpOrigin, [
    'http://localhost:9000', // Co-worker dev-server
    'http://127.0.0.1:9001', // My dev-server
])) header("Access-Control-Allow-Origin: ${httpOrigin}");
header('Access-Control-Allow-Credentials: true');

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X