Access-Control-Allow-Originワイルドカードサブドメイン、ポート、およびプロトコル

336
Elie 2012-12-23 03:44.

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

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

通常、オリジンからのリクエストを有効にしたいのですが、以下に一致します(限定されます)。

//*.mywebsite.com:*/*

10 answers

218
Noyo 2015-01-17 08:09.

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対応リソースの応答ヘッダーを追加します(理由の例を参照)。

267
monsur 2012-12-23 10:14.

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

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

60
DaveRandom 2013-09-24 02:09.

編集:これの代わりに@Noyoのソリューションを使用してください。これは、負荷がかかった状態で、よりシンプルで明確になり、パフォーマンスが大幅に向上する可能性があります。

歴史的な目的のためだけにここに残された元の答え!!


私はこの問題をいじってみて、Apacheで動作するこの再利用可能な.htaccess(またはhttpd.conf)ソリューションを思いつきました。

<IfModule mod_rewrite.c>
<IfModule mod_headers.c>
    # Define the root domain that is allowed
    SetEnvIf Origin .+ ACCESS_CONTROL_ROOT=yourdomain.com

    # Check that the Origin: matches the defined root domain and capture it in
    # an environment var if it does
    RewriteEngine On
    RewriteCond %{ENV:ACCESS_CONTROL_ROOT} !=""
    RewriteCond %{ENV:ACCESS_CONTROL_ORIGIN} =""
    RewriteCond %{ENV:ACCESS_CONTROL_ROOT}&%{HTTP:Origin} ^([^&]+)&(https?://(?:.+?\.)?\1(?::\d{1,5})?)$
    RewriteRule .* - [E=ACCESS_CONTROL_ORIGIN:%2]

    # Set the response header to the captured value if there was a match
    Header set Access-Control-Allow-Origin %{ACCESS_CONTROL_ORIGIN}e env=ACCESS_CONTROL_ORIGIN
</IfModule>
</IfModule>

ACCESS_CONTROL_ROOTブロックの上部にある変数をルートドメインに設定するだけで、ドメインと一致する場合、Origin:リクエストヘッダー値がAccess-Control-Allow-Origin:応答ヘッダー値でクライアントにエコーバックされます。

sub.mydomain.comとして使用できることにも注意してください。これにより、ACCESS_CONTROL_ROOTオリジンがsub.mydomain.comとに制限されます*.sub.mydomain.com(つまり、ドメインルートである必要はありません)。変更が許可されている要素(プロトコル、ポート)は、正規表現のURI一致部分を変更することで制御できます。

25
Pratap Koritala 2016-09-24 09:54.

受け入れられた答えは以下を行うことができないので、私はこの質問に答えています

  1. 正規表現のグループ化はパフォーマンスへの影響であり、必須ではありません。
  2. プライマリドメインと一致することはできず、サブドメインでのみ機能します。

例:次のCORSヘッダーは送信されません http://mywebsite.com のために働いている間 http://somedomain.mywebsite.com/

SetEnvIf Origin "http(s)?://(.+\.)?mywebsite\.com(:\d{1,5})?$" CORS=$0

Header set Access-Control-Allow-Origin "%{CORS}e" env=CORS
Header merge  Vary "Origin"

サイトを有効にするには、上記のApache構成の「mywebsite.com」の代わりにサイトを配置するだけです。

複数のサイトを許可するには:

SetEnvIf Origin "http(s)?://(.+\.)?(othersite\.com|mywebsite\.com)(:\d{1,5})?$" CORS=$0

展開後のテスト:

次のcurl応答には、変更後に「Access-Control-Allow-Origin」ヘッダーが含まれている必要があります。

curl -X GET -H "Origin: http://examplesite1.com" --verbose http://examplesite2.com/query
14
Lars 2015-05-23 00:42.

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'),
3
AamirR 2018-10-28 03:33.

Access-Control-Allow-Origin.htaccessで設定すると、次の機能のみが機能します。

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

私は他のいくつかの提案のキーワードを試してみましたHeader appendHeader setどれも働いていないこれらのキーワードが有効なため、古くなったりしない場合、私はわかりませんけれども、SOの多くの回答で提案されているようにnginxの

これが私の完全な解決策です:

SetEnvIf Origin "http(s)?://(.+\.)?domain\.com(:\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]
2
K8sN0v1c3 2017-11-19 08:30.

「cookieドメイン」(www.domain.tld)からフォントを読み取るときに、静的な「cookie-less」ドメインのFont Awesomeで同様の問題が発生し、この投稿が私たちのヒーローでした。ここを参照してください:「ミッシングクロスオリジンリソースシェアリング(CORS)応答ヘッダー」Webフォントの問題を修正するにはどうすればよいですか?

copy / paste-rタイプの場合(そしていくつかの小道具を与えるために)、私はこれをすべての貢献からつなぎ合わせて、サイトルートの.htaccessファイルの先頭に追加しました:

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

超安全、超エレガント。気に入ってください:リソース泥棒/ホットリンカータイプにサーバーの帯域幅を開放する必要はありません。

小道具:@Noyo @DaveRandom @ pratap-koritala

(私はこれを受け入れられた答えへのコメントとして残そうとしました、しかし私はまだそれをすることができません)

1
Jack K 2018-04-25 10:00.

元の答えはApache2.4より前のものだったようです。それは私にはうまくいきませんでした。2.4で機能させるために変更しなければならなかったものは次のとおりです。これは、yourcompany.comのサブドメインの任意の深さで機能します。

SetEnvIf Host ^((?:.+\.)*yourcompany\.com?)$ 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"
1
RiZKiT 2018-12-05 00:54.

Spring Bootの場合RegexCorsConfiguration、公式を拡張するこれを見つけましたCorsConfiguration:https://github.com/looorent/spring-security-jwt/blob/master/src/main/java/be/looorent/security/jwt/RegexCorsConfiguration.java

0
Capricorn 2018-11-28 06:19.

孤立したものが正規表現になってしまったため、Larsの回答を少し変更\して、実際のホスト(プロトコルやポートに注意を払わない)のみを比較する必要があり、本番localhostドメイン以外のドメインをサポートしたいと思いました。そのため、$allowedパラメーターを配列に変更しました。

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;
}

次のように使用します。

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

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

驚くほど素晴らしいDropMixミュージックミキシングカードゲームは30ドルで驚くべき取引です

驚くほど素晴らしいDropMixミュージックミキシングカードゲームは30ドルで驚くべき取引です

DropMixはNFC対応のカードゲームで、基本的にはリミックスアーティストになります。現在、Amazonでは$ 30まで下がっており、これまでで最高の価格に匹敵します。ロックバンドで有名なHarmonixによって開発されたDropMixは、おそらく少し野心的すぎるように思われます。結局のところ、ほとんどの人は素晴らしいリズムを持っていませんが、ゲームは驚くほどうまく実行されます。

メアリーJ.ブライジがついにハリウッドウォークオブフェイムスターを獲得

メアリーJ.ブライジがついにハリウッドウォークオブフェイムスターを獲得

写真:APメアリーJ.ブライジは、間もなくハリウッドウォークオブフェイムのスターを獲得します。これは、メアリーJよりもハリウッドウォークオブフェイムのほうが正直なところ恩恵です。

MeltdownとSpectreの脆弱性についてこれまでに知っていることはすべて、簡単な方法で説明されています

MeltdownとSpectreの脆弱性についてこれまでに知っていることはすべて、簡単な方法で説明されています

画像:グラズ工科大学/ NataschaEiblがデザインしたロゴ。MeltdownとSpectreは、攻撃者がシステムメモリに保存されているあらゆる種類の情報にアクセスできるようにする2つの脆弱性に付けられた名前です。

彼のニューヨークの家から追い出されようとしている97歳の第二次世界大戦の獣医。メリーエフィングクリスマス

彼のニューヨークの家から追い出されようとしている97歳の第二次世界大戦の獣医。メリーエフィングクリスマス

日本人に襲われたときに真珠湾にいた97歳の第二次世界大戦のベテランが、ニューヨークのブルックリンから追い出されています。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language