我部署与Apache的PHP应用程序启用基本身份验证。
当从本地访问与阿贾克斯,会出现以下错误。
无法加载https://(myapp).herokuapp.com/api.php?mode=xxx:响应预检请求未通过访问控制检查:否“访问控制允许来源”标题存在于所请求的资源。因此,原产地“空”是不允许访问。响应有HTTP状态代码401。
我的.htaccess的设置是这样的。
Header set Access-Control-Allow-Origin "*"
AuthUserFile /app/.htpasswd
AuthType Basic
AuthName "Restricted Access"
Require valid-user
而且,我的计划是这样的。
<button>Go!</button><br>
<textarea name="" id="result" cols="100" rows="10"></textarea>
<script src="./jquery-3.3.1.min.js"></script>
<script src="./jquery.base64.min.js"></script>
<script>
var uri = "https://(myapp).herokuapp.com/api.php?mode=xxx";
$('button').on('click', function() {
$.ajax({
url: uri,
success: function(response) {
$('textarea').val(response);
},
error: function(xhr, textStatus, errorThrown) {
console.log(textStatus + " : " + errorThrown);
},
beforeSend: function(xhr) {
var credentials = $.base64.encode("user:pass");
xhr.setRequestHeader("Authorization", "Basic " + credentials);
}
});
});
</script>
如果禁用基本身份验证,数据可以得到成功。
所以,我认为这是Apache的问题,而不是PHP。
我有一个类似的问题,这个问题是我没有正确响应CORS OPTIONS请求。我用的是heroku/php
buildpack,而不是Apache,并使用Silex的部署我的应用程序。你的情况可能与其他的选择而变化。
不管 - 我不得不增加一个选项的路线,然后发回一个HTTP 200响应之前添加相应的头文件。请参见下面的代码。我已经离开我的记录,显示了请求和响应头以供参考。希望能帮助到你。
$app->options('/mv', function() use($app) {
$app['monolog']->addDebug(">>> >>> >>> BEGIN RECEIVED HEADERS >>> >>> >>> ");
foreach (getallheaders() as $name => $value) {
$app['monolog']->addDebug(">>> $name: $value");
}
$app['monolog']->addDebug(">>> >>> >>> END RECEIVED HEADERS >>> >>> >>> ");
$app['monolog']->addDebug(">>> >>> ");
header("Access-Control-Allow-Origin: *");
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization');
header('HTTP/1.1 200');
$app['monolog']->addDebug(">>> >>> ");
$app['monolog']->addDebug(">>> >>> >>> BEGIN HEADERS SENT BACK >>> >>> >>> ");
foreach (headers_list() as $name => $value) {
$app['monolog']->addDebug(">>> $name: $value");
}
$app['monolog']->addDebug(">>> >>> >>> END HEADERS SENT BACK >>> >>> >>> ");
return json_encode(array());
});