2015-12-22 13 views
5

私のシナリオは2つのWebサーバー1つのローカルと1つのリモートで構成されています。アクセス制御 - 許可原点angjsをPHPに

ローカルWebサーバー(Apache)は、リモートWebサーバー(Lighttpd)に対してajaxリクエストを作成するWebアプリケーションを処理します。

Ajaxリクエストはangularjs $ httpを使用します。

var req = { 
    method: 'POST', 
    url: 'http://url/myphp.php', 
    headers: { 
     'Authorization': 'Basic ' + btoa('username:password'), 
     'Content-Type': 'application/x-www-form-urlencoded' 
    }, 
    xhrFields: { 
     withCredentials: true 
    }, 
    crossDomain: true, 
    data: xmlString 
} 

$http(req).then(function() { 
    console.log("OK!"); 
}); 

リモートPHPスクリプトは次のとおりです。

<?php 
    echo "You have CORS!"; 
?> 

は、残念ながら私は

401 Unhauthorized 
XMLHttpRequest cannot load http://url/myphp.php. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8888' is therefore not allowed access. The response had HTTP status code 401. 

リモートWebサーバが認証モードが有効の.htpasswdたとCORS要求が設定されました。あなたは、角度がPOSTを行う前に、アクセス起源ヘッダをチェックする飛行前のOPTIONS要求を行っているクロスドメインPOSTを行っているので

はのlighttpd.conf

setenv.add-response-header = ("Access-Control-Allow-Origin" => "*") 
+0

何ブラウザ? – noahdotgansallo

+0

ChromeとFirefoxの両方 – gravi

+0

私はこの同じ問題を抱えていました。明らかに、ヘッダーにもかかわらず – noahdotgansallo

答えて

0

の作品に従ってください。 ブラウザの[NET]タブでこれが確認されます。 サーバーがOPTIONS要求にうまく応答していないため、AngularはPOSTを拒否します。

あなたがPOSTMANを使用してサーバに投稿する場合は、すべてOKですか?

Angularが飛行前のリクエストをしないように設定することは可能です。

また、OPTIONS要求に正しく応答するように、特にOPTIONS要求に応じて正しいAccess Originヘッダーを返すようにサーバーを構成します。 (それは、なぜPOSTを作る気にしていない場合OPTIONSはただ、あなたのサーバがこれらのヘッダーが設定されているかどうかを確認しようとしている?)

うまくいけば、この情報は正しい方向にあなたを指します。アドオンレスポンスヘッダはlighttpdの中で動作するために

2

あなたserver.modulesでmod_setenvを有効にする必要があります。ただし、mod_statusの前にこのmod_setenvを有効にする必要があります。

server.modules = (
    # ... 
    "mod_fastcgi", 
    "mod_rewrite", 
    "mod_redirect", 
    "mod_setenv", ## before mod_status 
    "mod_status", 
    # ... 
) 

は、別の方法としては、私も追加したいCORSが

<?php 
header("Access-Control-Allow-Origin: *"); 
?> 

ヘッダ出力にPHPを使用することができることをあなたはHTTPが基本的な送信している場合は/あなたが起源のためのワイルドカードを使用することはできません認証データをダイジェスト。あなた

setenv.add-response-header = ("Access-Control-Allow-Origin" => "example.com") 
setenv.add-response-header = ("Access-Control-Allow-Credentials" => "true") 
関連する問題