This will happen in IE if there's a directive that forbids caching on the post-redirection page. If you remove the No-Cache header, you will find that the problem no longer repros.
Here's a Meddler script that demonstrates the behavior:
import Meddler;
import System;
import System.Net.Sockets;
import System.Windows.Forms;
class Handlers
{
static function OnConnection(oSession: Session)
{
if (oSession.ReadRequest())
{
var oHeaders: ResponseHeaders = new ResponseHeaders();
oHeaders["Connection"] = "close";
if (oSession.urlContains("postRedir.asp"))
{
oHeaders.Status = "200 OK";
oHeaders["Content-Type"] = "text/html";
oHeaders["Cache-Control"] = "no-cache";
oSession.WriteString(oHeaders);
oSession.WriteString("");
oSession.WriteString("Top of page<br /><br /><br /><br /><br /><br />");
oSession.WriteString("<br /><br /><br /><br /><div id='firstAnchor'>Div with ID firstAnchor</div>Click this link: <A href='#secondAnchor'>#secondAnchor</A>");
oSession.WriteString("<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />");
oSession.WriteString("<br /><br /><br /><br /><br /><br /><br /><br /><br /><div id='secondAnchor'>Div with ID secondAnchor</a>");
}
else
if (oSession.urlContains("doRedir.asp"))
{
oHeaders.Status = "301 Redir";
oHeaders["Location"] = "/postRedir.asp#firstAnchor";
oSession.WriteString(oHeaders.ToString());
}
else
{
oHeaders.Status = "200 OK";
oHeaders["Content-Type"] = "text/html";
oSession.WriteString(oHeaders);
oSession.WriteString("This is a test case for http://stackoverflow.com/questions/1985056/response-redirect-with-a-fragment-identifier-causes-unexpected-refresh-when-later<BR/>");
oSession.WriteString("Click this link: <A href='doRedir.asp'>Do Redirect</A>");
oSession.WriteString("<form action='doRedir.asp' method='post'><input type=submit value='Submit as form' /></form>");
}
}
oSession.CloseSocket();
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…