Заголовки CORS 'Access-Control-Allow- *' не устанавливаются ни на какие запросы от моего домена www, но работают нормально для моего бета-домена с идентичной конфигурацией.
У меня есть Angular 7, размещенный на Apache2, говорящий с бэкэндом Java Spring, размещенным на Apache Tomcat. Я также использую Cloudflare CDN, но сейчас я обхожу этот кеш.
Версия:
@angular/http@~7.1.0
rxjs@~6.3.3
spring-boot-starter-parent@2.0.4.RELEASE
Tomcat 8.5.14
В целях подготовки у меня есть два домена, работающих на моем сервере Apache2: https://beta.example.com и https://www.example.com. Оба из них имеют идентичные конфигурации виртуальных хостов (за исключением DocumentRoot / Directory, очевидно) и содержат этот блок: -
<IfModule mod_headers.c>
Header unset Access-Control-Allow-Origin
Header unset Access-Control-Allow-Headers
Header unset Access-Control-Allow-Methods
Header always set Access-Control-Allow-Origin "https://beta.server.com"
Header always append Access-Control-Allow-Origin "https://www.server.com"
Header always set Access-Control-Allow-Headers "Authorization,Content-Type,Origin"
Header always set Access-Control-Allow-Methods "POST,GET,PUT,DELETE"
</IfModule>
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
В моем приложении Java Spring у меня есть следующий файл конфигурации:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://www.server.com", "https://beta.server.com")
.allowedMethods("POST", "GET", "PUT", "DELETE")
.allowedHeaders("Authorization", "Content-Type", "Origin");
}
}
Как вы можете видеть, везде, где я указал источник, я указал оба источника вместе, поэтому они должны вести себя одинаково.
Наконец, я делаю HTTP-вызовы из Angular следующим образом:
this.headers = new HttpHeaders({
'Authorization': 'Bearer ' + this.getAccessToken(),
'Content-Type': 'application/json'
});
getUser(): Promise<any> {
return this.http.get(this.apiUrl + '/user', { headers: this.headers }).toPromise();
}
Когда я посещаю https://beta.example.com,, все предварительные запросы выполняются успешно, и все загружается нормально. Все заголовки CORS отображаются в предварительных ответах, так как они были установлены в конфигурации виртуального хоста. Все отлично!
HTTP/2.0 200 OK
date: Fri, 04 Jan 2019 14:52:40 GMT
set-cookie: __cfduid=d5fcc5cd672befaae80920288ee1527fc1546613559; expires=Sat, 04-Jan-20 14:52:39 GMT; path=/; domain=.server.com; HttpOnly
vary: Origin
vary: Access-Control-Request-Method
vary: Access-Control-Request-Headers
access-control-allow-origin: https://beta.server.com
access-control-allow-methods: POST,GET,PUT,DELETE
access-control-allow-headers: authorization, content-type
access-control-max-age: 1800
allow: GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server: cloudflare
cf-ray: 493e87bdb89dc2d3-FRA
X-Firefox-Spdy: h2
Однако при https://www.example.com, OPTIONS возвращает 200 OK, но выдает следующую ошибку в веб-консоли:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://www.myserver.com:8443/api/v2/user. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://www.myserver.com:8443/api/v2/user. (Reason: CORS request did not succeed).
Вот заголовки ответа:
HTTP/2.0 200 OK
date: Fri, 04 Jan 2019 14:54:55 GMT
set-cookie: __cfduid=d90819c09242b1c78140a54a7c8a2e5fb1546613695; expires=Sat, 04-Jan-20 14:54:55 GMT; path=/; domain=.server.com; HttpOnly
allow: GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server: cloudflare
cf-ray: 493e8b0c9936c2d3-FRA
X-Firefox-Spdy: h2