web-dev-qa-db-ja.com

ApacheのAccess-Control-Allow-Originヘッダーで複数のドメインを処理する

クロスドメインアクセスヘッダー用にApacheを構成します。フォーラムのスレッド数で提案されているように、複数の組み合わせを試しました。しかし、それは私のために働いていません。

方法は、私が試した:

1)Header setを使用して、次のように別の行にドメインを指定します。

Header set Access-Control-Allow-Origin "example1.com"
Header set Access-Control-Allow-Origin "example2.com"
Header set Access-Control-Allow-Origin: "example3.com"

この設定では、ピッキング最後の1つのみで、残りはすべて無視されます。

2)Header addを使用して、次のように別の行にドメインを指定します。

Header add Access-Control-Allow-Origin "example1.com"
Header add Access-Control-Allow-Origin "example2.com"
Header add Access-Control-Allow-Origin: "example3.com"

これにより、3つのドメインすべてがヘッダーに表示されますが、Firefoxではフォントが選択されません。

3.)SetEnvIfを使用してみましたが、再び動作しません:

SetEnvIf Origin "http(s)?://(www\.)?(mydomain.com|mydomain2.com)$" AccessControlAllowOrigin=$0$1
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin

最後に「*」で作業しますが、これは使いたくありません。

これで助けてください。

30
Kuldeep

3つのドメインの場合、.htaccessで:

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

私はこれを試してみましたが、うまくいきます。それがあなたに合わないなら教えてください。

39
George

マニュアル を誤解していない限り、次のようになります。

Header always append Access-Control-Allow-Origin: "example1.com"
Header always append Access-Control-Allow-Origin: "example2.com"
Header always append Access-Control-Allow-Origin: "example3.com"

マニュアルには、setおよびaddアクションが次のように動作することが記載されています。

set: "応答ヘッダーが設定され、以前のヘッダーをこの名前に置き換えます"

add: "...これにより、同じ名前を持つ2つ(またはそれ以上)のヘッダーが生じる可能性があります。これにより、予期しない結果が生じる可能性があります..."

17
Jon

特定のURIへのアクセスを制限するには、これらのドキュメントをチェックアウトします。

CrossOriginRequestSecurity

サーバー側のアクセス制御#Apache_examples

役立つヒントの1つは、Apacheの書き換え、環境変数、ヘッダーを使用して、特定のURIにAccess-Control-Allow- *を適用することです。これは、たとえば、クロスオリジンリクエストを資格情報なしのGET /api(.*).jsonリクエストに制約する場合に便利です。

RewriteRule ^/api(.*)\.json$ /api$1.json [CORS=True]
Header set Access-Control-Allow-Origin "*" env=CORS
Header set Access-Control-Allow-Methods "GET" env=CORS
Header set Access-Control-Allow-Credentials "false" env=CORS

また、一般的には W3 Wiki-CORS Enabled#For_Apache に従って、ヘッダーを公開するには、Directory、Location、およびFilesセクション内、または.htaccessファイル内に次の行を追加できます。

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "*"
</IfModule>

また、setではなくaddを使用できますが、addはヘッダーを複数回追加できるため、通常はsetを使用する方が安全です。

4
Brad Sturtevant

これを試して、それは私のために動作します。 .htaccessで適用:

SetEnvIf Origin "^http(s)?://(.+\.)?(domain\.org|domain2\.com)$" Origin_is=$0 
Header always set Access-Control-Allow-Origin %{Origin_is}e env=Origin_is
2
MD IRFAN

Apache 2.4では、Apache WebサーバーのSETコマンドを使用して、ヘッダーを動的に設定しました。

<IfModule mod_deflate.c>
  # CORS
  SetEnvIfNoCase Origin "http(s)?://(\w+\.)?(example.com|localhost)(:[0-9]+)?$" AccessControlAllowOrigin=$0
  Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
  Header set Access-Control-Allow-Credentials true
</IfModule>

ADDコマンドは機能しませんでした。

0
Manjun Gim

100%動作します。htaccessで適用:

# Enable cross domain access control
SetEnvIf Origin "^http(s)?://(.+\.)?(domain1\.com|domain2\.org|domain3\.net)$" REQUEST_Origin=$0
Header always set Access-Control-Allow-Origin %{REQUEST_Origin}e env=REQUEST_Origin
Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
Header always set Access-Control-Allow-Headers "x-test-header, Origin, X-Requested-With, Content-Type, Accept"

# Force to request 200 for options
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule .* / [R=200,L]
0
levin