我今天与您联系是因为我的网站上出现了一个问题,阻止我使用会话cookie提出请求。让我详细解释一下情况。
我在以下地址使用Web主机托管我的网站:https://www.coopratings.fr/。要测试,您可以使用用户名“a@a”和密码“a”登录,并使用导航栏中的“+”按钮发布游戏。
当用户想要在我的网站上执行操作时,会向服务器发送一个请求,服务器会使用“session_start()”函数和“_SESSION[“isLogged”]”变量检查用户是否登录。
问题如下:在一些机器上,“phpsessid”cookie在请求之间被保留,这使得登录验证系统能够正常运行。但在其他机器上,“phpsessid”cookie会随着每个请求而改变,这会阻止系统正常工作。
在分析问题时,我注意到每次浏览器在“POST”请求之前发送“OPTIONS”请求时,“phpsessid”cookie都会发生变化,并且我没有看到它存储在浏览器的“F12”选项卡的“存储-> Cookie”部分。
此外,当我使用XAMPP使用URL 127.0.0.1/mysite/..."
在本地托管我的网站时,一切都正常工作。但是,当我使用phpStorm显示页面时,它使用了URL "http://localhost:63342/mySite/..."
,浏览器发送了“OPTIONS”请求(这会导致前面提到的相同问题)。
当我在本地使用localhost:63342/mySite/..."
登录时,响应显示“You are not logged in”,因为我已经为注销POST请求的情况配置了它。
另一方面,当我登录到地址coopratings.fr
时,控制台显示以下错误:
"Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://www.coopratings.fr/Rest_API/...e_reviewid.php. (Reason: header 'content-type' is not allowed according to header 'Access-Control-Allow-Headers' from CORS preflight response)."
"Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://www.coopratings.fr/Rest_API/...e_reviewid.php. (Reason: CORS request did not succeed). Status code: (null)."
"Uncaught (in promise) TypeError: NetworkError when attempting to fetch resource."
我在互联网上做了广泛的研究,并尝试了不同的解决方案,但到目前为止,我还没有能够解决这个问题。以下是我到目前为止所尝试的:
- 通过添加以下代码处理PHP文件中的“OPTIONS”请求:
if (
isset($_SERVER['REQUEST_METHOD'])
&& $_SERVER['REQUEST_METHOD'] === 'OPTIONS'
) {
exit();
}
- 使用以下配置修改响应标头:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTION');
header('Access-Control-Allow-Headers: Access-Control-Allow-Headers,Content-Type,Access-Control-Allow-Methods, Authorization, X-Requested-With, Accept, Cookie');
header('Access-Control-Allow-Credentials: true');
- 添加“模式:'cors'“和“credentials:'include'“参数添加到请求中(不是同时)。
- 在会话创建期间修改cookie参数:
public static function startSession(){
$maxlifetime = 3600;
$secure = true;
$httponly = true;
$samesite = 'None';
if(PHP_VERSION_ID < 70300) {
session_set_cookie_params($maxlifetime, '/; samesite='.$samesite, $_SERVER['HTTP_HOST'], $secure, $httponly);
} else {
session_set_cookie_params([
'lifetime' => $maxlifetime,
'path' => '/',
'domain' => $_SERVER['HTTP_HOST'],
'secure' => $secure,
'httponly' => $httponly,
'samesite' => $samesite
]);
}
session_start();
}
- 以下是我发送请求的方式:
let url = new URL('http://127.0.0.1/coopratings/Rest_API/api/');
return fetch(url + request, {
method: type,
body: body,
headers: {
"Content-Type": "application/json",
}
})
.then(res => {
return res.json();
})
希望能找到解决这个问题的办法。提前感谢您的帮助。
1条答案
按热度按时间atmip9wb1#
好吧,我找到解决办法了。请确保请求相同的来源。对我来说,我已经忘记了www。并在请求中允许凭据