Перезапись URL и 301 Redirect ... Перенаправляет на исходный URL - PullRequest
0 голосов
/ 18 февраля 2010

Отвечая на вопрос другого человека здесь о SO, я обнаружил, что в моем глобальном коде перенаправления есть небольшая "ошибка".

Я подключил класс Global к модулю 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) 

не то, что я хочу делать, так как это взлом, но это не сработало.

Любой совет по этому поводу был бы очень признателен!

Ответы [ 4 ]

1 голос
/ 07 марта 2010

Вот ответ, который работает

    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 голосов
/ 18 февраля 2010

Используйте IIS и настройте другой веб-сайт. Сделайте постоянный редирект, сохранив URL.

0 голосов
/ 24 февраля 2010

Попробуйте использовать Request.RawUrl, например.

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

Request.RawUrl должен быть исходным URL из фактического http-запроса.

0 голосов
/ 18 февраля 2010

Вместо этого:

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()
...