AJAXとPHPを使用して複数のサブドメインから単一のAPIドメインにCookieを渡す必要があるときに以前のソリューションで問題が発生したため、後でこの投稿を追加しました
これが課題と解決策でした。
1-api.example.comのバックエンドPHP。
2-one.example.com、two.example.comなどの複数のJSフロントエンド。
3-Cookieは双方向で渡される必要がありました。
4-api.example.comの複数のフロントエンドからPHPバックエンドへのAJAX呼び出し
5-PHPでは、$ _ SERVER ["HTTP_ORIGIN"]を使用することを好みません。私の意見では、常に信頼できる/安全であるとは限りません(HTTP-ORIGINが常に空であるブラウザがいくつかありました)。
単一のフロントエンドドメインを使用してPHPでこれを行う通常の方法は、次のコマンドでPHPコードを開始することです。
header('Access-Control-Allow-Origin: https://one.example.com');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
header('Access-Control-Allow-Credentials: true');
そして、one.example.comドメインのJSでは:
jQuery.ajax({
url: myURL,
type: "POST",
xhrFields: {withCredentials: true},
dataType: "text",
contentType: "text/xml; charset=\"utf-8\"",
cache: false,
headers: "",
data: myCallJSONStr,
success: function(myResponse) {.....}
ただし、APIドメインを呼び出すために複数のサブドメインを使用しているため、これは機能しません。
そして、私がクッキーを渡したいので、この解決策は機能しません:
header('Access-Control-Allow-Origin: *');
これは、JSサイトのCookieの受け渡し設定と競合します。
xhrFields: {withCredentials: true}
これが私がしたことです:
1-GETパラメーターを使用してサブドメインを渡します。
2-PHPでメインドメインをハードコーディングして、(すべての)サブドメインのみが許可されるようにします。
これは私のソリューションのJS/JQueryAJAX部分です。
関数getSubDomain(){
let mySubDomain = "";
let myDomain = window.location.host;
let myArrayParts = myDomain.split(".");
if (myArrayParts.length == 3){
mySubDomain = myArrayParts[0];
}
return mySubDomain;
}
そしてAJAX呼び出しでは:
let mySubDomain = getSubDomain();
if (mySubDomain != ""){
myURL += "?source=" + mySubDomain + "&end"; //use & instead of ? if URL already has GET parameters
}
jQuery.ajax({
url: myURL,
type: "POST",
xhrFields: {withCredentials: true},
dataType: "text",
contentType: "text/xml; charset=\"utf-8\"",
cache: false,
headers: "",
data: myCallJSONStr,
success: function(myResponse) {.....}
最後に、PHPの部分:
<?php
$myDomain = "example.com";
$mySubdomain = "";
if (isset($_GET["source"])) {
$mySubdomain = $_GET["source"].".";
}
$myDomainAllowOrigin = "https://".$mySubdomain.$myDomain;
$myAllowOrigin = "Access-Control-Allow-Origin: ".$myDomainAllowOrigin;
//echo $myAllowOrigin;
header($myAllowOrigin);
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
header('Access-Control-Allow-Credentials: true');
重要、すべてのサブドメインにCookieを設定することを忘れないでください。この場合、Cookieのドメインは次のようになります。.example.com(メインドメインの前にドットが付いている):
<?php
//////////////// GLOBALS /////////////////////////////////
$gCookieDomain = ".example.com";
$gCookieValidForDays = 90;
//////////////// COOKIE FUNTIONS /////////////////////////////////
function setAPCookie($myCookieName, $myCookieValue, $myHttponly){
global $gCookieDomain;
global $gCookieValidForDays;
$myExpires = time()+60*60*24*$gCookieValidForDays;
setcookie($myCookieName, $myCookieValue, $myExpires, "/", $gCookieDomain, true, $myHttponly);
return $myExpires;
}
このソリューションにより、example.comの任意のサブドメインからapi.example.comのAPIを呼び出すことができます。
NB。呼び出し元のサブドメインが1つしかない状況では、PHPの代わりに.htaccessを使用してCORSを設定することをお勧めします。api.example.comを呼び出すone.example.comのみの.htaccess(linux / apache)の例を次に示します。
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://one.example.com"
Header set Access-Control-Allow-Headers "Origin, Content-Type, X-Auth-Token"
Header set Access-Control-Allow-Credentials "true"
</IfModule>
そして、この.htaccessをapi.example.comのルートに配置します。