.htaccessのヘッダーセットAccess-Control-Allow-Originが機能しない


90

私の理由がわかりません .htaccessヘッダー設定が機能しないません。

私の.htaccessファイルの内容:

Header set Access-Control-Allow-Origin *
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Allow-Headers "*"
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]

しかし、を削除Headerして追加するとindex.php、すべて正常に動作します。

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: *");

何が欠けていますか?

回答:


134

これはうまくいくはずです:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

46
Apacheモジュールのヘッダーをアクティブにすることを忘れないでくださいa2enmod headers
Lucas Serafim

1
修正:「メソッドPUTはAccess-Control-Allow-Methodsでは許可されていません」
Rahul Prasad

6
また、Header setこの場合に使用することをお勧めします。コードが変更され、ヘッダーが設定されている場合、Apacheにa header addを実行させると、二重の**ヘッダーが送信されます。これは、たとえばRestangularなどのクライアントを破壊します。
ジュリアン

2
必要に応じて、忘れないでくださいHeader add Access-Control-Allow-Credentials "true"
マルコマルサラ2016

20

念のため、私はまったく同じ問題に直面しており、どの回答も機能しませんでした。

ヘッダーチェッカーツールを使用しました:http : //www.webconfs.com/http-header-check.php

私は自分のIP(http://192.0.2.1/upload)でテストしていましたが、戻ってきたのは次のとおりです。

HTTP/1.1 301 Moved Permanently => 
Date => Sat, 10 Jan 2015 04:03:35 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
Location => http://192.0.2.1/upload/
Content-Length => 380
Connection => close
Content-Type => text/html; charset=iso-8859-1

リダイレクトが発生したため、AJAXリクエストはリダイレクトを受け入れません。

ドメインの最後にスラッシュがないことがわかりましたhttp://192.0.2.1/upload /

私は最後にスラッシュを使ってもう一度テストしましたが、これは以下で得られました。スクリプトにもスラッシュを追加し、現在は機能しています。

HTTP/1.1 200 OK => 
Date => Sat, 10 Jan 2015 04:03:53 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By => PHP/5.3.8
Access-Control-Allow-Origin => *
Access-Control-Allow-Methods => PUT, GET, POST, DELETE, OPTIONS
Access-Control-Allow-Headers => *
Content-Length => 1435
Connection => close
Content-Type => text/html

このツールを使用して、ヘッダーが適切かどうかをテストし、何が起こっているかをトラブルシューティングします。


5
私は今これを解決するために開いている11のタブを持っています。この答えはもっと多くの場所にあるはずです。
JDavis 2016年

私の場合、末尾のスラッシュを削除する必要がありました。とても嬉しいです。私が新しいときにこれをトラブルシューティングするのに非常に多くの時間を費やしましたが、数時間前に動作しているはずでした。
gorelog 2018年

11

GoDaddyで共有ホスティングを利用しています。私もこの質問への回答が必要でした。周りを検索したところ、それが可能であることがわかりました。

.htaccessファイルを作成し、アクションページと同じフォルダに配置しました。.htaccessファイルの内容は次のとおりです。

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

これが私のajax呼び出しです:

    $.ajax({
        url: 'http://www.mydomain.com/myactionpagefolder/gbactionpage.php',  //server script to process data
        type: 'POST',
        xhr: function() {  // custom xhr
            myXhr = $.ajaxSettings.xhr();
            if(myXhr.upload){ // check if upload property exists
                myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // for handling the progress of the upload
            }
            return myXhr;
        },
        //Ajax events
        beforeSend: beforeSendHandler,
        success: completeHandler,
        error: errorHandler,
        // Form data
        data: formData,
        //Options to tell JQuery not to process data or worry about content-type
        cache: false,
        contentType: false,
        processData: false
    });

参照のためにこの記事を参照してください:

.htaccessのヘッダーセットAccess-Control-Allow-Originが機能しない


8

次の点に注意してください。

 Header add Access-Control-Allow-Origin "*"

これは、すべての人にアクセスを許可するのにまったく賢明ではありません。既知の信頼できるホストのリストのみを許可することをお勧めします...

Header add Access-Control-Allow-Origin "http://aaa.example"
Header add Access-Control-Allow-Origin "http://bbb.example"
Header add Access-Control-Allow-Origin "http://ccc.example"

よろしく、


3
これは機能しません。Access-Control-Allow-Originは複数の値を許可されていません。Originリクエストヘッダーの値に基づいてヘッダーを動的に設定する必要があります。
クエンティン

7

Apacheモジュールヘッダーa2enmodヘッダーをアクティブ化し、問題は解決しました。


ログのエラーは、私が行った変更がなぜ失敗するのかについて明確ではなく、この回答は大きな助けとなりました。sudo a2enmod headers再起動するとうまくいきました!
cchana 2018

3

外部ルートフォルダーの.htaccessでこれを試してください

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

注意してください:ヘッダーadd Access-Control-Allow-Origin "*"これは、すべての人にアクセスを許可するのにまったく賢明ではありません。私はあなたが使うべきだと思います:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://example.com"
</IfModule>

3

ヘッダーチェックサイトhttp://www.webconfs.com/http-header-check.phpへのリンクについて、Miroの回答を+1しました。使用するたびに不快な広告がポップアップ表示されますが、それでも、Access-Control-Allow-Originヘッダーの存在を確認するのに非常に役立ちます。

WebページのJavaScriptから.jsonファイルを読んでいます。以下を.htaccessファイルに追加すると、IE 11(バージョン11.447.14393.0)でWebページを表示するときに問題が解決することがわかりました。

<FilesMatch "\.(json)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

以下を/etc/httpd.conf(Apacheの設定ファイル)に追加しました:

AllowOverride All

header-checkerサイトは、Access-Control-Allow-Originヘッダーが送信されていることを確認しました(ありがとう、Miro!)。

ただし、Firefox 50.0.2、Opera 41.0.2353.69、およびEdge 38.14393.0.0 は、Access-Control-Allow-Originヘッダーがなくても、すべてファイルをフェッチします。(注:私が使用していた2つのドメインはどちらも同じサーバーの同じIPv4アドレスでホストされているため、IPアドレスをチェックしている可能性があります。)

ただし、Chrome 54.0.2840.99 m(64ビット)はAccess-Control-Allow-Originヘッダーを無視して失敗し、誤ってレポートします。

要求されたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。したがって、オリジン ' {mydomain} 'はアクセスを許可されていません。

これはある種の「最初の」ものでなければならないと思います。IEは正常に動作しています。Chrome、Firefox、Opera、Edgeはすべてバグがあります。そしてChromeは最悪です。それは通常のケースの正反対ではありませんか?


0

何もせずに半日過ごした後。すべてが機能していたが、ヘッダーチェックサービスを使用する。職場のファイアウォールはそれらを取り除いていました


0

これを試して:

<IfModule mod_headers.c>
     Header set Access-Control-Allow-Credentials true
     Header set Access-Control-Allow-Origin "your domain"
     Header set Access-Control-Allow-Headers "X-Requested-With"
</IfModule>

既知の信頼できるホストのリストを許可することをお勧めします。


0

他の誰かがこれを試みている場合、最も支持されている答えが機能するはずです。ただし、問題が発生している場合は、ブラウザがREQUESTをキャッシュしている可能性があります。確認のためにクエリ文字列を追加します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.