すべてのサブドメイン、ポート、プロトコルでCORSを有効にしようとしています。
たとえば、からXHRリクエストを実行できるようにしたい http://sub.mywebsite.com:8080/ に https://www.mywebsite.com/*
通常、オリジンからのリクエストを有効にしたいのですが、以下に一致します(限定されます)。
//*.mywebsite.com:*/*
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対応リソースの応答ヘッダーを追加します(理由の例を参照)。
CORS仕様はオールオアナッシングです。*
、null
または正確なプロトコル+ドメイン+ポートのみをサポートします。http://www.w3.org/TR/cors/#access-control-allow-origin-response-header
サーバーは正規表現を使用してオリジンヘッダーを検証する必要があります。その後、Access-Control-Allow-Origin
応答ヘッダーでオリジン値をエコーできます。
編集:これの代わりに@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一致部分を変更することで制御できます。
受け入れられた答えは以下を行うことができないので、私はこの質問に答えています
例:次の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
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'),
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 append
、Header 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]
「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
(私はこれを受け入れられた答えへのコメントとして残そうとしました、しかし私はまだそれをすることができません)
元の答えは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"
Spring Bootの場合RegexCorsConfiguration
、公式を拡張するこれを見つけましたCorsConfiguration
:https://github.com/looorent/spring-security-jwt/blob/master/src/main/java/be/looorent/security/jwt/RegexCorsConfiguration.java
孤立したものが正規表現になってしまったため、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']));
}
特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。
ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。
ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。
DropMixはNFC対応のカードゲームで、基本的にはリミックスアーティストになります。現在、Amazonでは$ 30まで下がっており、これまでで最高の価格に匹敵します。ロックバンドで有名なHarmonixによって開発されたDropMixは、おそらく少し野心的すぎるように思われます。結局のところ、ほとんどの人は素晴らしいリズムを持っていませんが、ゲームは驚くほどうまく実行されます。
写真:APメアリーJ.ブライジは、間もなくハリウッドウォークオブフェイムのスターを獲得します。これは、メアリーJよりもハリウッドウォークオブフェイムのほうが正直なところ恩恵です。
画像:グラズ工科大学/ NataschaEiblがデザインしたロゴ。MeltdownとSpectreは、攻撃者がシステムメモリに保存されているあらゆる種類の情報にアクセスできるようにする2つの脆弱性に付けられた名前です。
日本人に襲われたときに真珠湾にいた97歳の第二次世界大戦のベテランが、ニューヨークのブルックリンから追い出されています。
Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday
シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。
オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。
Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。
遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。
2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。
計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。