#php #angular #cors
Вопрос:
Я пытаюсь подключить угловую форму к файлу phpmail. Нет никаких проблем, когда файлы angular компилируются и загружаются в виде веб-приложения вместе с файлом php. Но если они где-то еще, я получаю следующую ошибку:
Access to XMLHttpRequest at 'https://www.example.com/sendEmail.php' from origin 'http://localhost:8100' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Посмотрев это довольно часто, все говорят, чтобы разрешить доступ-Контроль-Разрешить-происхождение, что я и сделал. Но это все равно говорит о том же самом.
Вот php — код:
<?php
switch ( $_SERVER[ 'REQUEST_METHOD' ] ) {
case ( "OPTIONS" ):
header( "Access-Control-Allow-Origin: *" );
header( "Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS" );
header( "Access-Control-Allow-Headers: AccountKey, x-requested-with, Content-Type, origin, authorization, accept, client-security-token, host, date, cookie, cookie2" );
header( "Access-Control-Allow-Credentials: true" );
header( "Content-Type: application/json");
exit;
case ( "POST" ):
$json = file_get_contents( 'php://input' );
$params = json_decode( $json, TRUE );
// Do all the things necessary here to send the email
break;
default:
header( "Allow: POST", true, 405 );
exit;
}
?>
Я явно что-то упускаю, но понятия не имею, что именно. Нужно ли мне также что-то добавлять в угловой файл? Я предположил, что нет, так как ошибка консоли говорит о том, что ее нет в запрошенном ресурсе. Но это так, не так ли?
Редактировать:
Как и было запрошено, здесь приведена (сокращенная) версия углового кода для вызова php-файла в первую очередь.
ngOnInit() {
this.num1 = this.getRandomArbitrary(2, 10);
this.num2 = this.getRandomArbitrary(2, 10);
this.solution = this.num1 this.num2;
this.endpoint = "https://www.example.com/sendEmail.php";
this.contactUs = this.formBuilder.group({
firstName: [''],
surname: [''],
companyName: [''],
jobTitle: [''],
email: ['', Validators.required],
telephone: [''],
enquiry: [''],
userSolution: ['', [Validators.required, this.myValidator(this.solution)]],
});
}
submitForm() {
let postVars = this.contactUs.value;
postVars['recipientEmail'] = this.email;
postVars['subject'] = this.subject;
// console.log(postVars);
this.http.post(this.endpoint, postVars)
.subscribe((val) => {
if (val == null) {
this.contactUs.reset();
this.presentToast();
}
},
response => {
console.log("POST call in error", response);
},
() => {
console.log("The POST observable is now completed.");
})
}
Заглядывая в сеть, я вижу, что sendEmail.php получает ошибку 403 во время предполетной подготовки. Вот скриншот:
сетевые заголовки:
General:
Request URL: https://www.websitesberkshire.co.uk/sendEmail.php
Request Method: OPTIONS
Status Code: 403 Forbidden
Remote Address: [my server ip]:443
Referrer Policy: strict-origin-when-cross-origin
Response Headers:
Connection: close
Content-Length: 318
Content-Type: text/html; charset=iso-8859-1
Date: Mon, 15 Mar 2021 12:13:40 GMT
Server: Apache
Request Headers:
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Cache-Control: no-cache
Connection: keep-alive
Host: www.example.com
Origin: http://localhost:8100
Pragma: no-cache
Referer: http://localhost:8100/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36
Комментарии:
1. Что ж, используйте сетевой инструмент, посмотрите на ответ, который на самом деле возвращается. Предположительно, у него все еще нет этих заголовков. Теперь спросите себя, почему. Возможно, PHP — код не выполняется-например, может быть, веб-сервер возвращает что-то другое вместо этого, прежде чем запрос попадет в PHP? Вы отладили, что на самом деле происходит с вашим запросом ОПЦИЙ?
2. Также было бы полезно, если бы вы показали нам, как вы генерируете запрос в коде JS/Angular, на случай, если с этим что-то не так.
3. Также поместите заголовки в запрос на публикацию.
4. @Daantje справедливая точка зрения, но мы еще даже не зашли так далеко, на данный момент это не проблема операции.
5. Если файл php находится рядом с веб-приложением, он работает безупречно и отправляет электронное письмо, проблема возникает только тогда, когда веб-приложение не было загружено на сервер и все еще работает с моего локального хоста. Я отредактировал свой пост и включил больше материала в надежде, что кто-то может знать решение, поскольку в настоящее время оно сводит меня с ума.