IE 8无法重定向到相对路径

时间:2014-01-28 13:37:29

标签: asp.net internet-explorer-8

在我的SSO服务中,我在验证响应消息

后重定向传入请求
HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=utf-8
Location: /home?s=ZXVuPXN0YWZmdXNyMDE7ZXVwPXN0QGZmdXNSMDE7b2ZmaWNlaWQ9O29mZmljZT07Y3VzdD1PSzt0cz03MzUyNjIwNDIwO3ZlbmRvcj0xO3N1bj1zZWVrZXIwN0BkZW1vLmNvbTs=
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 27 Jan 2014 09:20:36 GMT
Content-Length: 261

<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/home?s=ZXVuPXN0YWZmdXNyMDE7ZXVwPXN0QGZmdXNSMDE7b2ZmaWNlaWQ9O29mZmljZT07Y3VzdD1PSzt0cz03MzUyNjIwNDIwO3ZlbmRvcj0xO3N1bj1zZWVrZXIwN0BkZW1vLmNvbTs=">here</a>.</h2>
</body></html>

上面的302消息发生在客户端和服务器之间的一系列重定向之后我使用fiddler将其列在下面

#   Result  Protocol    Host    URL Body    Caching Content-Type    Process Comments    Custom  
4   302 HTTPS   client.net  /ok/r/oauth/authorize?client_id=bededeb806f783b75ef94ad871a4e03e2c7aeb1fb316d8822233afaa664d17cb&redirect_uri=https%3A%2F%2Fexample.sso.com%2FOKJobMatch.aspx&state=hk1udegmnspyvum5obcwscwe&response_type=code 232 no-cache, private   text/html; charset=utf-8    iexplore:5324           
Suceeded
6   301 HTTPS   example.sso.com /OKJobMatch.aspx?code=c4ee0346f27db36ea662b1d14d3adc6ba6d33e11c3a9dddf759619cf778b0b24&state=hk1udegmnspyvum5obcwscwe   317 private     text/html; charset=utf-8    iexplore:5324           
Suceeded
8   302 HTTPS   example.com /home?s=ZXVuPXN0YWZmdXNyMDE7ZXVwPXN0QGZmdXNSMDE7b2ZmaWNlaWQ9O29mZmljZT07Y3VzdD1PSzt0cz03MzUyNjQwNTQzO3ZlbmRvcj0xO3N1bj1zZWVrZXIwN0BkZW1vLmNvbTs=    261 private     text/html; charset=utf-8    iexplore:5324           
Suceeded with response which mentioned above in the question

9   404 HTTPS   client.net  /home?s=ZXVuPXN0YWZmdXNyMDE7ZXVwPXN0QGZmdXNSMDE7b2ZmaWNlaWQ9O29mZmljZT07Y3VzdD1PSzt0cz03MzUyNjQwNTQzO3ZlbmRvcj0xO3N1bj1zZWVrZXIwN0BkZW1vLmNvbTs=    0           iexplore:5324           
Failed

现在所有其他浏览器,包括IE 9,10和Chrome,Mozilla都能够理解这一点并重新定向,但IE 8无法重定向,但它会引发404错误。

进一步分析

我们发现,一旦传递302消息,IE就会使用客户端URL的域而不是服务器URL

所以不要去https://example.com/home 它将http://client.net.home。这看起来很奇怪,因为example.com是提供重定向消息的那个。

这与http消息的referrer属性有关,因为我注意到在客户端消息中设置了referrer

重定向后的客户端请求[会产生404错误]

GET https://client.net/home?s=ZXVuPXN0YWZmdXNyMDE7ZXVwPXN0QGZmdXNSMDE7b2ZmaWNlaWQ9O29mZmljZT07Y3VzdD1PSzt0cz03MzUyNjUwNDM4O3ZlbmRvcj0xO3N1bj1zZWVrZXIwN0BkZW1vLmNvbTs= HTTP/1.1
Accept: image/jpeg, image/gif, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*
Referer: https://deployment.ajla.net/ok/mn_loginstatistics_dsp.cfm
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)
Accept-Encoding: gzip, deflate
Host: deployment.ajla.net
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: _ga=GA1.3.502780954.1391010694; CFID=90758; CFTOKEN=4b494a1b21bbdc06-D9196ABC-FAE3-1AFE-97F781B8328159A0; TEST=1; USAGE_BYPASS=A819843C5390612C307C2E9A433D04101C64C9842FB41146ECFE739EDEDB13F4D692A9A537C758E1F5548B2306170514FAE5F13FF767A436FD24140F4B90F6A2; AJLAUTHSESSION=D93D4D42-ABAC-D007-DC3A2A48361A041C; _joblink_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFRkkiJTg2MTlkMDZmZjZhMDIwODhkZWJhMjIxODNiN2I2NTNmBjsAVEkiDHVzZXJfaWQGOwBGaQNZnRk%3D--8592abe6d424b90671f013da99d74a1df8e84a33

对于相同的情况,mozilla和其他浏览器选择www.example.com作为域。这是因为referrer属性,如果是,有没有办法在客户端代码中修复它?

编辑2

    <rewrite>
        <rules>
            <rule name="Redirect to HTTPS" stopProcessing="true">
                <match url="(.*)" />
                <conditions>
                    <add input="{HTTPS}" pattern="^OFF$" />
                </conditions>
                <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="SeeOther" />
            </rule>
        </rules>
    </rewrite>

我注意到,在第一次从客户端站点重定向到我们的站点时,有两个302发生,第一个返回一个相对路径。第二个返回绝对路径。第二个是从源生成的,但第一个不是源。我不确定这个重定向发生在哪里。我怀疑这可能是因为在网站上设置了http重定向。但我不确定只是粘贴了上面的http重定向设置。

有人可以告诉你有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:1)

由于所有浏览器都会理解绝对路径,因此返回绝对路径。我们将无法改变IE8。

答案 1 :(得分:0)

根据您的SSO处理程序的工作方式,您可以使用Response.Redirect( ... )函数重定向浏览器。此函数将使用"~/path/to/file"表示法获取相对URI。

答案 2 :(得分:0)

我已经使用了一种解决方法来解决这个问题,我知道它可能不是一个合法的解决方案,但我没有别的选择让它在IE8中运行

 protected void Application_EndRequest()
        {
            if (Context.Response.StatusCode == 302)
            {

                if (Context.Response.RedirectLocation.ToLower().StartsWith("/home") && Request.Params.Get("s") != null)
                {
                    Context.Response.RedirectLocation = System.Web.HttpContext.Current.Request.Url.OriginalString;
                }
            }

        }