483 Stimmen

Access-Control-Allow-Origin Platzhalter für Subdomänen, Ports und Protokolle

Ich versuche, CORS für alle Subdomänen, Ports und Protokolle zu aktivieren.

Ich möchte zum Beispiel eine XHR-Anfrage von http://sub.mywebsite.example:8080/ まで https://www.mywebsite.example/ *

In der Regel möchte ich Anfragen aus den entsprechenden Herkunftsländern aktivieren (und auf diese beschränken):

//*.mywebsite.example:*/*

4voto

AamirR Punkte 10468

Bei der Einstellung Access-Control-Allow-Origin en .htaccess funktionierte nur Folgendes:

SetEnvIf Origin "http(s)?://(.+\.)?domain\.example(:\d{1,5})?$" CRS=$0
Header always set Access-Control-Allow-Origin "%{CRS}e" env=CRS

Ich habe mehrere andere vorgeschlagene Schlüsselwörter ausprobiert Header append , Header set , keine funktioniert wie in vielen Antworten auf Stack Overflow vorgeschlagen, obwohl ich keine Ahnung habe, ob diese Schlüsselwörter veraltet oder nicht gültig sind für nginx .

Hier ist meine vollständige Lösung:

SetEnvIf Origin "http(s)?://(.+\.)?domain\.example(:\d{1,5})?$" CRS=$0
Header always set Access-Control-Allow-Origin "%{CRS}e" env=CRS
Header merge Vary "Origin"

Header always set Access-Control-Allow-Methods "GET, POST"
Header always set Access-Control-Allow-Headers: *

# Cached for a day
Header always set Access-Control-Max-Age: 86400

RewriteEngine On

# Respond with 200OK for OPTIONS
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]

4voto

RiZKiT Punkte 1592

Para Spring Boot Ich fand dies RegexCorsConfiguration die die offizielle CorsConfiguration : https://github.com/looorent/spring-security-jwt/blob/master/src/main/java/be/looorent/security/jwt/RegexCorsConfiguration.java

2voto

K8sN0v1c3 Punkte 111

Wir hatten ähnliche Probleme mit Font Awesome auf einer statischen "Cookie-losen" Domain, wenn wir Schriften aus der "Cookie-Domain" lesen ( www.domain.example ) und dieser Beitrag war unser Held. Siehe hier: Wie kann ich das Problem des fehlenden CORS-Antwort-Headers (Cross-Origin Resource Sharing) beheben?

Für die Kopieren/Einfügen-Typen (und um ihnen etwas Anerkennung zukommen zu lassen) habe ich dies aus allen Beiträgen zusammengesetzt und am Anfang der Seite hinzugefügt .htaccess Datei der Site Root:

<IfModule mod_headers.c>
 <IfModule mod_rewrite.c>
    SetEnvIf Origin "http(s)?://(.+\.)?(othersite\.example|mywebsite\.example)(:\d{1,5})?$" CORS=$0
    Header set Access-Control-Allow-Origin "%{CORS}e" env=CORS
    Header merge  Vary "Origin"
 </IfModule>
</IfModule>

Super sicher, super elegant. Ich liebe es: Sie müssen Ihre Server-Bandbreite nicht für Ressourcendiebe / Hot-Link-Typen freigeben.

2voto

Jack K Punkte 21

Es sieht so aus, als ob die ursprüngliche Antwort für die Zeit vor Apache 2.4 galt. Bei mir hat es nicht funktioniert. Hier ist, was ich ändern musste, damit es in 2.4 funktioniert. Dies funktioniert für jede Tiefe der Subdomain von yourcompany.example .

SetEnvIf Host ^((?:.+\.)*yourcompany\.example?)$    CORS_ALLOW_ORIGIN=$1
Header append Access-Control-Allow-Origin  %{REQUEST_SCHEME}e://%{CORS_ALLOW_ORIGIN}e    env=CORS_ALLOW_ORIGIN
Header merge  Vary "Origin"

0voto

Capricorn Punkte 2061

Ich musste Folgendes ändern Lars' ein bisschen antworten, als verwaistes \ in der Regex landete, um nur den tatsächlichen Host zu vergleichen (ohne auf das Protokoll oder den Port zu achten), und ich wollte die localhost Domäne neben meiner Produktionsdomäne. Daher habe ich die $allowed Parameter ein Array sein.

    function getCORSHeaderOrigin($allowed, $input)
    {
        if ($allowed == '*') {
            return '*';
        }

        if (!is_array($allowed)) {
            $allowed = array($allowed);
        }

        foreach ($allowed as &$value) {
            $value = preg_quote($value, '/');

            if (($wildcardPos = strpos($value, '\*')) !== false) {
                $value = str_replace('\*', '(.*)', $value);
            }
        }

        $regexp = '/^(' . implode('|', $allowed) . ')$/';

        $inputHost = parse_url($input, PHP_URL_HOST);

        if ($inputHost === null || !preg_match($regexp, $inputHost, $matches)) {
            return 'none';
        }

        return $input;
    }

Die Verwendung ist wie folgt:

    if (isset($_SERVER['HTTP_ORIGIN'])) {
        header("Access-Control-Allow-Origin: " . getCORSHeaderOrigin(array("*.myproduction.com", "localhost"), $_SERVER['HTTP_ORIGIN']));
    }

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