Access-Control-Allow-Origin 不适用于 ionic 5 应用程序
Access-Control-Allow-Origin not working with ionic 5 app
我正在按照教程在 Ionic 应用程序中从我的服务器发送和接收数据,但由于 CORS,我在执行此操作时遇到了麻烦。我非常熟悉 CORS 问题,并且在将我的 Javascript Ajax 代码连接到服务器上的 PHP 后端时经常使用“Access-Control-Allow-Origin”解决方案。但是,Ionic 似乎没有任何作用。
我在 SO 上看到了几个 questions/answers,也阅读了一些博客,他们都说这应该有效,但实际上没有。
我可以完全控制我的端点并在那里创建了一个 PHP 文件,如下所示:
header("Access-Control-Allow-Origin: *");
$strStudents = '{
"students": [
{
"id": 1,
"name": "Enola Rowe",
"class": "tony@mcu.com",
"address": "131 Oswaldo Street"
},{
"id": 2,
"name": "Timmothy Lueilwitz",
"age": "15",
"address": "37137 Abbigail Lock"
},{
"id": 3,
"name": "Madilyn Pacocha",
"age": "14",
"address": "094 Morris Plains"
},{
"id": 4,
"name": "Harley Cremin",
"age": "17",
"address": "14855 Cathy Square"
},{
"id": 5,
"name": "Juana Ziemann",
"age": "16",
"address": "612 Dayana Stream"
}
]
}';
return $strStudents;
?>
我也尝试过其他组合,例如:
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
但没有雪茄。 Ionic 中的相关代码(可能不相关,但我还是会把它放在这里)如下所示:
export class ApiService {
base_path = 'http://mywebsite.com/App';
constructor(private http: HttpClient) { }
// Http Options
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
})
}
handleError(error: HttpErrorResponse) {
if (error.error instanceof ErrorEvent) {
// A client-side or network error occurred. Handle it accordingly.
console.error('An error occured: ', error.error.message);
;
} else {
// The backend returned an unsuccessful response code.
// The response body may contain clues as to what went wrong,
console.error(
`Backend returned code ${error.status}, ` + `Body was: ${error.error} `);
}
// return an observable with a user-facing error message
return throwError(
'Something bad happened; please try again later.');
}
// Create a new item
createItem(item): Observable<Student> {
return this.http.post<Student>(this.base_path, JSON.stringify(item), this.httpOptions)
.pipe(retry(2), catchError(this.handleError));
}
// Get a Student's data by ID
getItem(id): Observable<Student> {
return this.http.get<Student>(this.base_path + '/' + id, this.httpOptions)
.pipe(retry(2), catchError(this.handleError));
}
// Get a list of Students
getList(): Observable<Student> {
return this.http.get<Student>(this.base_path)
.pipe(retry(2), catchError(this.handleError));
}
我得到的错误是:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading
the remote resource at http://mywebsite.com/App. (Reason: CORS header
‘Access-Control-Allow-Origin’ missing)
(多次)及以后:
Backend returned code 0, Body was: [object ProgressEvent]
api.service.ts:31:14 ERROR Something bad happened; please try again
later.
我做错了什么?
此外,我想指出,我已经研究了 here 中描述的代理方法,但这将是最后的手段,因为它使我在服务器上添加新文件和更改路径的灵活性降低。
编辑:由于一些评论说没有进行足够的研究,我列出了一些我尝试过的来源:
https://www.joshmorony.com/dealing-with-cors-cross-origin-resource-sharing-in-ionic-applications/(以此开头)
https://www.techiediaries.com/ionic-2-proxy/(这不起作用 - 应用程序无法识别代理)
https://ionicframework.com/blog/handling-cors-issues-in-ionic/(没有 ionic.project 文件 - 也尝试了 projectname.project 文件和其他组合)
https://github.com/ionic-team/ionic-framework/issues/16233(与此问题相关的公开错误报告)
(不用说也不起作用)
我也在 Ionic 中尝试了 Native Http,但得到了同样的错误。
我已经在 Firefox 和 Chrome
中试过了
我认为人们假设这是一个简单的 php 编码错误。我相信它与 Ionic 和 HttpClient 有更多关系。
我找到了问题并进行了修复。正如预期的那样,它在 Ionic App 的代码中。但这并不完全是我所期望的。希望这对处于相同困境的人有用。问题出在这一行:
base_path = 'http://mywebsite.com/App';
这应该是:
base_path = 'http://mywebsite.com/App/';
细微差别但很重要。仔细查看控制台日志后,我发现它给出了 301 错误,原来是“永久重定向”。在这种情况下重定向到第二个 URI(附加斜线)。如果我一直使用 base_path = 'http://mywebsite.com/App/index.php';
或任何其他文件名,我可能不会看到此错误。
当然,301 重定向返回“Content-Type:text/html”,因为它是一个纯文本页面,而应用程序期望“Content-Type:[=22=” ]”,因此出现 CORS 错误。
我正在按照教程在 Ionic 应用程序中从我的服务器发送和接收数据,但由于 CORS,我在执行此操作时遇到了麻烦。我非常熟悉 CORS 问题,并且在将我的 Javascript Ajax 代码连接到服务器上的 PHP 后端时经常使用“Access-Control-Allow-Origin”解决方案。但是,Ionic 似乎没有任何作用。 我在 SO 上看到了几个 questions/answers,也阅读了一些博客,他们都说这应该有效,但实际上没有。
我可以完全控制我的端点并在那里创建了一个 PHP 文件,如下所示:
header("Access-Control-Allow-Origin: *");
$strStudents = '{
"students": [
{
"id": 1,
"name": "Enola Rowe",
"class": "tony@mcu.com",
"address": "131 Oswaldo Street"
},{
"id": 2,
"name": "Timmothy Lueilwitz",
"age": "15",
"address": "37137 Abbigail Lock"
},{
"id": 3,
"name": "Madilyn Pacocha",
"age": "14",
"address": "094 Morris Plains"
},{
"id": 4,
"name": "Harley Cremin",
"age": "17",
"address": "14855 Cathy Square"
},{
"id": 5,
"name": "Juana Ziemann",
"age": "16",
"address": "612 Dayana Stream"
}
]
}';
return $strStudents;
?>
我也尝试过其他组合,例如:
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
但没有雪茄。 Ionic 中的相关代码(可能不相关,但我还是会把它放在这里)如下所示:
export class ApiService {
base_path = 'http://mywebsite.com/App';
constructor(private http: HttpClient) { }
// Http Options
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
})
}
handleError(error: HttpErrorResponse) {
if (error.error instanceof ErrorEvent) {
// A client-side or network error occurred. Handle it accordingly.
console.error('An error occured: ', error.error.message);
;
} else {
// The backend returned an unsuccessful response code.
// The response body may contain clues as to what went wrong,
console.error(
`Backend returned code ${error.status}, ` + `Body was: ${error.error} `);
}
// return an observable with a user-facing error message
return throwError(
'Something bad happened; please try again later.');
}
// Create a new item
createItem(item): Observable<Student> {
return this.http.post<Student>(this.base_path, JSON.stringify(item), this.httpOptions)
.pipe(retry(2), catchError(this.handleError));
}
// Get a Student's data by ID
getItem(id): Observable<Student> {
return this.http.get<Student>(this.base_path + '/' + id, this.httpOptions)
.pipe(retry(2), catchError(this.handleError));
}
// Get a list of Students
getList(): Observable<Student> {
return this.http.get<Student>(this.base_path)
.pipe(retry(2), catchError(this.handleError));
}
我得到的错误是:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://mywebsite.com/App. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing)
(多次)及以后:
Backend returned code 0, Body was: [object ProgressEvent] api.service.ts:31:14 ERROR Something bad happened; please try again later.
我做错了什么?
此外,我想指出,我已经研究了 here 中描述的代理方法,但这将是最后的手段,因为它使我在服务器上添加新文件和更改路径的灵活性降低。
编辑:由于一些评论说没有进行足够的研究,我列出了一些我尝试过的来源:
https://www.joshmorony.com/dealing-with-cors-cross-origin-resource-sharing-in-ionic-applications/(以此开头)
https://www.techiediaries.com/ionic-2-proxy/(这不起作用 - 应用程序无法识别代理)
https://ionicframework.com/blog/handling-cors-issues-in-ionic/(没有 ionic.project 文件 - 也尝试了 projectname.project 文件和其他组合)
https://github.com/ionic-team/ionic-framework/issues/16233(与此问题相关的公开错误报告)
我也在 Ionic 中尝试了 Native Http,但得到了同样的错误。
我已经在 Firefox 和 Chrome
中试过了我认为人们假设这是一个简单的 php 编码错误。我相信它与 Ionic 和 HttpClient 有更多关系。
我找到了问题并进行了修复。正如预期的那样,它在 Ionic App 的代码中。但这并不完全是我所期望的。希望这对处于相同困境的人有用。问题出在这一行:
base_path = 'http://mywebsite.com/App';
这应该是:
base_path = 'http://mywebsite.com/App/';
细微差别但很重要。仔细查看控制台日志后,我发现它给出了 301 错误,原来是“永久重定向”。在这种情况下重定向到第二个 URI(附加斜线)。如果我一直使用 base_path = 'http://mywebsite.com/App/index.php';
或任何其他文件名,我可能不会看到此错误。
当然,301 重定向返回“Content-Type:text/html”,因为它是一个纯文本页面,而应用程序期望“Content-Type:[=22=” ]”,因此出现 CORS 错误。