396

すべてのサブドメイン、ポート、およびプロトコルに対して CORS を有効にしようとしています。

たとえば、http: //sub.mywebsite.com:8080/からhttps://www.mywebsite.com/への XHR リクエストを実行できるようにしたい*

通常、一致するオリジンからのリクエストを有効にしたいと思います(および限定されます):

//*.mywebsite.com:*/*

4

12 に答える 12

312

CORS 仕様はオール オア ナッシングです。*nullまたは正確なプロトコル + ドメイン + ポートのみをサポートします: http://www.w3.org/TR/cors/#access-control-allow-origin-response-header

サーバーは、正規表現を使用してオリジン ヘッダーを検証する必要があります。その後、Access-Control-Allow-Originレスポンス ヘッダーでオリジン値をエコーできます。

于 2012-12-22T20:14:31.117 に答える
250

DaveRandom の回答に基づいて、私も遊んでいてAccess-Control-Allow-Origin、書き換えルールを使用せずに同じ結果を生成する (現在の特定のプロトコル + ドメイン + ポートに動的に設定される)少し単純な Apache ソリューションを見つけました。

SetEnvIf Origin ^(https?://.+\.mywebsite\.com(?::\d{1,5})?)$   CORS_ALLOW_ORIGIN=$1
Header append Access-Control-Allow-Origin  %{CORS_ALLOW_ORIGIN}e   env=CORS_ALLOW_ORIGIN
Header merge  Vary "Origin"

以上です。

すべてのサブドメインに加えて、親ドメイン (mywebsite.com など) で CORS を有効にしたい場合は、最初の行の正規表現を次のように置き換えるだけです。

^(https?://(?:.+\.)?mywebsite\.com(?::\d{1,5})?)$.

注:仕様への準拠と正しいキャッシング動作のVary: Originために、CORS 以外のリクエストや許可されていないオリジンからのリクエストであっても、常に CORS 対応リソースのレスポンス ヘッダーを追加してください (理由の例を参照してください)。

于 2015-01-16T18:09:55.180 に答える
15

私はPHPのみのソリューションが必要だったので、誰かがそれを必要とする場合に備えて。「*.example.com」のような許可された入力文字列を受け取り、入力が一致する場合はリクエスト ヘッダー サーバー名を返します。

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

    $allowed = preg_quote($allowed, '/');

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

    $regexp = '/^' . $allowed . '$/';

    if (!preg_match($regexp, $input, $matches)) {
        return 'none';
    }

    return $input;
}

phpunit データ プロバイダーのテスト ケースは次のとおりです。

//    <description>                            <allowed>          <input>                   <expected>
array('Allow Subdomain',                       'www.example.com', 'www.example.com',        'www.example.com'),
array('Disallow wrong Subdomain',              'www.example.com', 'ws.example.com',         'none'),
array('Allow All',                             '*',               'ws.example.com',         '*'),
array('Allow Subdomain Wildcard',              '*.example.com',   'ws.example.com',         'ws.example.com'),
array('Disallow Wrong Subdomain no Wildcard',  '*.example.com',   'example.com',            'none'),
array('Allow Double Subdomain for Wildcard',   '*.example.com',   'a.b.example.com',        'a.b.example.com'),
array('Don\'t fall for incorrect position',    '*.example.com',   'a.example.com.evil.com', 'none'),
array('Allow Subdomain in the middle',         'a.*.example.com', 'a.bc.example.com',       'a.bc.example.com'),
array('Disallow wrong Subdomain',              'a.*.example.com', 'b.bc.example.com',       'none'),
array('Correctly handle dots in allowed',      'example.com',     'exampleXcom',            'none'),
于 2015-05-22T10:42:38.147 に答える