IE에서 보낸 모든 아약스 호출은 Angular에 의해 캐시되며 304 response
모든 후속 호출에 대해 a 를 얻습니다 . 요청은 동일하지만 제 경우에는 응답이 동일하지 않습니다. 이 캐시를 비활성화하고 싶습니다. cache attribute
$ http.get에 추가를 시도 했지만 여전히 도움이되지 않았습니다. 이 문제를 어떻게 해결할 수 있습니까?
답변
각 단일 GET 요청에 대해 캐싱을 비활성화하는 대신 $ httpProvider에서 전역 적으로 비활성화합니다.
myModule.config(['$httpProvider', function($httpProvider) {
//initialize get if not there
if (!$httpProvider.defaults.headers.get) {
$httpProvider.defaults.headers.get = {};
}
// Answer edited to include suggestions from comments
// because previous version of code introduced browser-related errors
//disable IE ajax request caching
$httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';
// extra
$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}]);
답변
요청에 고유 한 쿼리 문자열을 추가 할 수 있습니다 (jQuery가 cache : false 옵션으로 수행하는 작업이라고 생각합니다).
$http({
url: '...',
params: { 'foobar': new Date().getTime() }
})
더 나은 솔루션은 서버에 액세스 할 수있는 경우 캐싱을 방지하기 위해 필요한 헤더가 설정되어 있는지 확인할 수 있습니다. ASP.NET MVC
이 답변을 사용 하면 도움 이 될 수 있습니다.
답변
인터셉터를 추가 할 수 있습니다.
myModule.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('noCacheInterceptor');
}]).factory('noCacheInterceptor', function () {
return {
request: function (config) {
console.log(config.method);
console.log(config.url);
if(config.method=='GET'){
var separator = config.url.indexOf('?') === -1 ? '?' : '&';
config.url = config.url+separator+'noCache=' + new Date().getTime();
}
console.log(config.method);
console.log(config.url);
return config;
}
};
});
확인 후 console.log 줄을 제거해야합니다.
답변
난 그냥 각도 프로젝트에서 index.html에 세 개의 메타 태그를 추가하고 IE에서 캐시 문제가 해결되었습니다.
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Sat, 01 Dec 2001 00:00:00 GMT">
답변
다른 스레드에서 내 답변을 복제 합니다 .
들어 각도 2, 새로운 , 가장 쉬운 방법은 추가 no-cache
재정 의하여 헤더를 RequestOptions
:
import { Injectable } from '@angular/core';
import { BaseRequestOptions, Headers } from '@angular/http';
@Injectable()
export class CustomRequestOptions extends BaseRequestOptions {
headers = new Headers({
'Cache-Control': 'no-cache',
'Pragma': 'no-cache',
'Expires': 'Sat, 01 Jan 2000 00:00:00 GMT'
});
}
그리고 당신의 모듈에서 그것을 참조하십시오 :
@NgModule({
...
providers: [
...
{ provide: RequestOptions, useClass: CustomRequestOptions }
]
})
답변
내가 일한 보장 된 것은 다음과 같은 내용이었습니다.
myModule.config(['$httpProvider', function($httpProvider) {
if (!$httpProvider.defaults.headers.common) {
$httpProvider.defaults.headers.common = {};
}
$httpProvider.defaults.headers.common["Cache-Control"] = "no-cache";
$httpProvider.defaults.headers.common.Pragma = "no-cache";
$httpProvider.defaults.headers.common["If-Modified-Since"] = "Mon, 26 Jul 1997 05:00:00 GMT";
}]);
나는 모든 방법의 올바른 사용을 보장하기 위해 위의 해결 방법의 2 병합했다,하지만 당신은 대체 할 수 common
와 함께 get
또는 다른 방법 즉 put
, post
, delete
다른 경우에이 작업을 할 수 있습니다.
답변
이 줄만 도움이되었습니다 (Angular 1.4.8).
$httpProvider.defaults.headers.common['Pragma'] = 'no-cache';
UPD : 문제는 IE11이 적극적인 캐싱을 수행한다는 것입니다. Fiddler를 살펴볼 때 F12 모드에서 요청이 “Pragma = no-cache”를 전송하고 페이지를 방문 할 때마다 끝 점이 요청되는 것을 알았습니다. 그러나 일반 모드에서는 페이지를 처음 방문했을 때 끝 점이 한 번만 요청되었습니다.