Cache-Control Headers 导致后退按钮出现问题
Cache-Control Headers causing issues with back button
我正在处理遗留应用程序 运行 Java Struts v.1 和 WebSphere v.8.5 作为使用 https 连接的服务器。我正在尝试使应用程序在其安全性方面达到合规性。我们需要使用此应用程序完成的任务之一是在每个现有页面上添加 anti-caching 响应 header:
Cache-Control: no-cache, no-store
Expires: 0
Pragma: no-cache
我已设法添加 headers,尽管通过启用 headers 我们发现后退按钮功能在使用 HTTP [=56] 的页面中不再正常工作=] 请求。我们正在为他们各自的浏览器显示以下页面:
IE:
Webpage has expired
Most likely cause:
•The local copy of this webpage is out of date, and the website requires that you download it again.
Something to try:
Click on the Refresh button on the toolbar to reload the page.
After refreshing, you might need to navigate to the specific webpage again,
or re-enter information.
Chrome:
Confirm Form Resubmission
This webpage requires data that you entered earlier in order to be properly displayed.
You can send this data again, but by doing so you will repeat any action this page previously performed.
Press the reload button to resubmit the data needed to load the page.
ERR_CACHE_MISS
如果在显示这些屏幕后刷新页面,我们将导航回我们最初想要的页面。
调查问题似乎
cache-control : no-cache, no-store
header是点击后退按钮时出现错误页面的罪魁祸首。
因此我的问题是,在维护 header 或添加允许用户使用后退按钮而不会从浏览器看到错误屏幕的情况下,是否有任何解决方法然后不得不刷新页面。还是我只需要将使用 POST 调用的页面从 cache-control header 中排除?
注意几点:
-元标记被认为不足以修复此安全漏洞。 HTML Meta Tags and HTTP Headers
-我也尝试添加其他 cache-control header,但其中 none 致力于解决后面的问题:
must-revalidate
age
post & pre-checks
etc...
感谢任何见解和帮助。先感谢您。
对于遇到同样问题的任何人,这就是我解决以下错误的方法。
为服务器端呈现的页面实施了 Post/Redirect/Get (PRG) 模型。这个功能可以在大多数现代框架中找到。一个简单的 google 搜索将为您提供如何为您的框架执行此操作。
此外,对于页面,我不想实现 PRG 模型,而是想控制后退按钮事件。我最终将以下脚本与 JQuery 一起使用。
请注意:此方法仅适用于现代浏览器,请自行决定使用。
//Import JQuery
<script src="jquery-1.11.0.min.js"></script>
//Add this to your JS Logic for the page you want to change
<script type="text/javascript">
jQuery(document).ready(function($) {
if (window.history && window.history.pushState) {
$(window).on('popstate', function() {
var hashLocation = location.hash;
var hashSplit = hashLocation.split("#!/");
var hashName = hashSplit[1];
if (hashName !== '') {
var hash = window.location.hash;
if (hash === '') {
document.location.href = '/Your/Redirection/Here';
}
}
});
window.history.pushState('forward', null, '#SomeIDYouAreNotUsing');
}
});
</script>
我正在处理遗留应用程序 运行 Java Struts v.1 和 WebSphere v.8.5 作为使用 https 连接的服务器。我正在尝试使应用程序在其安全性方面达到合规性。我们需要使用此应用程序完成的任务之一是在每个现有页面上添加 anti-caching 响应 header:
Cache-Control: no-cache, no-store
Expires: 0
Pragma: no-cache
我已设法添加 headers,尽管通过启用 headers 我们发现后退按钮功能在使用 HTTP [=56] 的页面中不再正常工作=] 请求。我们正在为他们各自的浏览器显示以下页面:
IE:
Webpage has expired
Most likely cause:
•The local copy of this webpage is out of date, and the website requires that you download it again.
Something to try: Click on the Refresh button on the toolbar to reload the page. After refreshing, you might need to navigate to the specific webpage again, or re-enter information.
Chrome:
Confirm Form Resubmission
This webpage requires data that you entered earlier in order to be properly displayed. You can send this data again, but by doing so you will repeat any action this page previously performed. Press the reload button to resubmit the data needed to load the page.
ERR_CACHE_MISS
如果在显示这些屏幕后刷新页面,我们将导航回我们最初想要的页面。
调查问题似乎
cache-control : no-cache, no-store
header是点击后退按钮时出现错误页面的罪魁祸首。
因此我的问题是,在维护 header 或添加允许用户使用后退按钮而不会从浏览器看到错误屏幕的情况下,是否有任何解决方法然后不得不刷新页面。还是我只需要将使用 POST 调用的页面从 cache-control header 中排除?
注意几点:
-元标记被认为不足以修复此安全漏洞。 HTML Meta Tags and HTTP Headers
-我也尝试添加其他 cache-control header,但其中 none 致力于解决后面的问题:
must-revalidate
age
post & pre-checks
etc...
感谢任何见解和帮助。先感谢您。
对于遇到同样问题的任何人,这就是我解决以下错误的方法。
为服务器端呈现的页面实施了 Post/Redirect/Get (PRG) 模型。这个功能可以在大多数现代框架中找到。一个简单的 google 搜索将为您提供如何为您的框架执行此操作。
此外,对于页面,我不想实现 PRG 模型,而是想控制后退按钮事件。我最终将以下脚本与 JQuery 一起使用。
请注意:此方法仅适用于现代浏览器,请自行决定使用。
//Import JQuery
<script src="jquery-1.11.0.min.js"></script>
//Add this to your JS Logic for the page you want to change
<script type="text/javascript">
jQuery(document).ready(function($) {
if (window.history && window.history.pushState) {
$(window).on('popstate', function() {
var hashLocation = location.hash;
var hashSplit = hashLocation.split("#!/");
var hashName = hashSplit[1];
if (hashName !== '') {
var hash = window.location.hash;
if (hash === '') {
document.location.href = '/Your/Redirection/Here';
}
}
});
window.history.pushState('forward', null, '#SomeIDYouAreNotUsing');
}
});
</script>