2010-02-18 311 views
0

在回答关于SO的另一个人问题时,我发现在我的全局重定向代码中存在一个小“错误”。URL重写和301重定向...重定向到原始URL

我已经把一个全局类连接到一个HttpModule。它的工作是检测“http:/ www。”在URL中并将用户重定向到NON www。版本

Protected Sub OnBeginRequest(ByVal sender As Object, ByVal e As EventArgs) 
    'Force Removal of WWW 
    Dim application As HttpApplication = TryCast(sender, HttpApplication) 
    Dim url As Uri = application.Context.Request.Url 
    Dim hasWWW As Boolean = If(url.ToString.StartsWith("http://www."), True, False) 'UrlRegex.IsMatch(url.ToString()) 
    If hasWWW Then 
     Dim newUrl As [String] = UrlRegex.Replace(url.ToString(), [String].Format("{0}://", url.Scheme)) 
     application.Context.Response.Redirect(newUrl, False) 
     application.Context.Response.StatusCode = 301 
     application.Context.Response.End() 

    End If 

End Sub 

我遇到的问题是,当它重定向页面http://www.example.com/AboutUs,我们的目标是要把它去http://example.com/AboutUs(重写后的页面),而是它要http://example.com/Default.aspx?Slug=AboutUs(原始页面)。

我试图通过改变

Dim newUrl As [String] = UrlRegex.Replace(url.ToString(), [String].Format("{0}://", url.Scheme)) 
    application.Context.Response.Status = "301 Moved Permanently" 
    application.Context.Response.AddHeader("Location", newUrl.Replace("Default.aspx", "")) 

做一个黑客位来

Dim newUrl As [String] = UrlRegex.Replace(url.ToString(), [String].Format("{0}://", url.Scheme)) 
    newUrl = newUrl.Replace("Default.aspx?Slug=", "") 
    newUrl = newUrl.Replace("Default.aspx", "") 
    application.Context.Response.Status = "301 Moved Permanently" 
    application.Context.Response.AddHeader("Location", newUrl) 

不是我想反正这样做,因为这是一个黑客,但它并没有反正工作。

任何意见,将非常感激!

回答

1

这里有一个工作

Protected Sub OnBeginRequest(ByVal sender As Object, ByVal e As EventArgs) 
     'Force Removal of WWW 
     Dim application As HttpApplication = TryCast(sender, HttpApplication) 
     Dim url As Uri = application.Context.Request.Url 
     Dim hasWWW As Boolean = If(url.ToString.StartsWith(String.Format("{0}://www.", url.Scheme)), True, False) 
     Dim forceWWW As Boolean = Boolean.TryParse(ICMS.Site.Settings.GetSettingsValue("ForceWWW"), False) 
     'UrlRegex.IsMatch(url.ToString()) 
     If hasWWW Then 
      Dim newUrl As String = UrlRegex.Replace(url.ToString(), String.Format("{0}://", url.Scheme)) 
      application.Context.Response.Redirect(newUrl.Replace("Default.aspx?Slug=", String.Empty), False) 
      application.Context.Response.StatusCode = 301 
      application.Context.Response.End() 
     End If 

    End Sub 
0

取而代之的是:

application.Context.Response.Status = "301 Moved Permanently" 
application.Context.Response.AddHeader("Location", newUrl) 

试试这个:

application.Context.Response.Redirect(newUrl, false) 
application.Context.Response.StatusCode = 301 
application.Context.Response.End() 
+0

产生相同的行为与我原来的代码的答案。 – 2010-02-18 18:30:17

+0

@rockinthesixstring - 你有一个测试页面,所以我可以看到它发送的头文件? – 2010-02-18 18:39:56

+0

是的,http://staging.infinitas.ws:83/ – 2010-02-18 18:44:02

0

使用IIS和设置一个不同模式的网站。做一个永久的重定向,保存网址。

0

尝试使用Request.RawUrl,例如,

Dim newUrl As [String] = UrlRegex.Replace(Request.RawUrl.ToString(), [String].Format("{0}://", url.Scheme)) 

Request.RawUrl应该是实际http请求的原始URL。