CORSの投稿がたくさんあることを知っています。私はそれらに追加していますが、私を助ける答えは見つかりません。だから、私はphp apiに依存している角度4のアプリケーションを構築しています。CORS:PHP:プリフライト要求への応答が成功しません。原点を許可しています
XMLHttpRequest cannot load http://api.example.com/Account/Login . Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://app.example.com ' is therefore not allowed access.
私:私は次のエラーを取得するために、ローカルの作業それは、私がapp.example.com
でアプリ、およびapi.example.com
のAPIを使用してドメインにそれを投げた瞬間は、私は私のログインを乗り越えることができない、大丈夫ですPHPコードは次のようになります。
$http_origin = $_SERVER['HTTP_ORIGIN'];
$allowed_domains = array(
'http://example.com',
'https://example.com',
'http://app.example.com',
'https://app.example.com',
'http://www.example.com',
'https://www.example.com'
);
if (in_array(strtolower($http_origin), $allowed_domains))
{
// header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Origin: $http_origin");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Authorization, Content-Type,Accept, Origin");
exit(0);
}
マイ角度ポストは次のようになります。
public login(login: Login): Observable<LoginResponse> {
let headers = new Headers();
headers.append('Content-Type', 'application/x-www-form-urlencoded');
headers.append('Authorization', 'Basic ' + btoa(login.Username + ':' + login.Password));
return this.http.post(this.apiBaseUrl + '/Account/Login', "grant_type=client_credentials", { headers: headers })
.map(response => {
// code
});
}
私はCORSを気にしない郵便配達員による要求を、実行した場合、I GE T:
{ "error": "invalid_client", "error_description": "Client credentials were not found in the headers or body" }
私はちょうどテストし、それが問題の核心だったかどうかを確認するために「*
」に起源を設定しようとしました、そしてそれはまだ同じように失敗しました。
ただ、以下の情報から更新を編集 。ヘッダーのケーシングを変更しても効果はなく、ifステートメントからコードを引き出すことは効果がありませんでした。
私は自分のライブアプリに自分のローカルapiに行くようにPHPをデバッグし、PHPは期待どおりに動作しています。ヘッダーを設定し、それをそれぞれのifステートメントに入れます。
編集は、誰かが任意のアイデアを持っている場合、私は本当に私はそれを本当に感謝し、このいずれかでいくつかの助けを使用することができます2 を取ります。
編集は私が私の.htaccessではなく、私のPHPで全てのヘッダのものを設定した場合、それは私を経由することができます3 を取ります。しかし、今私は上記のエラーに悩まされていますが、実際には実際のサイトを使っています
{"error":"invalid_client","error_description":"Client credentials were not found in the headers or body"}
マイレスポンスヘッダは、私はそれが働いた後、私は私のドメインに*から、それを変更することがありますので、
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:authorization, content-type, accept, origin
Access-Control-Allow-Methods:GET, POST, OPTIONS
Access-Control-Allow-Origin:*
のようなものです。しかし今のところ私は*のままにしておきます。
私のヘッダーは要求どおりです。
if($ _SERVER ['REQUEST_METHOD'] == 'OPTIONS'){からコードを取り出して、何が起きたのかを確認します。 – MasoodUrRehman
ブラウザのネットワークタブを調べることで、サーバーレスポンスのスナップショットを共有できますか?デバッガで – MasoodUrRehman
応答]タブは空白ですが、ここではヘッダがあります - 応答: '許可:POST、OPTIONS、GET、HEAD、TRACE 接続:キープアライブ のContent-Length:0 のContent-Type:テキスト/平野 日:日、2017年6月11日二時41分43秒GMT キープアライブ:タイムアウト= 30 サーバー:Apacheが/ 2' 要求: '受け入れる:*/* 受け入れエンコード:gzipでは、 を収縮 アクセス制御要求ヘッダー:承認 アクセス制御要求メソッド:POST 接続:キープアライブ ホスト:api。試験ple.com 起源:http://app.example.com Referer:http:// app.example.com/login' – Nieminen