【问题标题】:Make a single page with friendly URL?用友好的 URL 制作一个页面?
【发布时间】:2015-09-01 03:36:04
【问题描述】:

我正在为工作中的网站创建一个新页面,我的老板希望它有一个友好的 URL。

目前是website.com/account-payments.aspx,他希望它是website.com/payments/

问题是,我不知道如何正确重写 url。我看到一个 NuGet 包推荐了“Microsoft ASP.NET 友好 URL”,但我在这个网络上没有管理员权限,我无法安装任何新的东西。我的老板在这方面帮助不大。

ASP.net 是否有任何内置功能可以让我重写 url?

编辑

我已将此类添加到我的 App_Code 文件夹中。

Imports Microsoft.VisualBasic
Imports System.Web

Public Class PaymentsHandler

    Implements IHttpHandler

    Public Sub ProcessRequest(ByVal context As  _
            System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest

        If context.Request.RawUrl.EndsWith("/payments/") Then
            context.Server.TransferRequest("/account-payments.aspx")
        End If
    End Sub
    Public ReadOnly Property IsReusable As Boolean Implements System.Web.IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property
End Class

在我的 web.config 文件中使用以下处理程序:

<handlers>
<add name="Payments" verb="*" path="/payments" type="PaymentsHandler" resourceType="Unspecified" />
</handlers>

现在,我在尝试浏览 website.com/payments/ 时收到 500 内部服务器错误,而不是一般的 404 错误

编辑 2:Electric Boogaloo

所以在 Googlin 之后,我发现有人遇到了类似的问题,他们通过在 web.config 中添加一个额外的处理程序来解决他们的问题。

<httpHandlers> <add verb="*" path="*/account-payments.aspx" type="PaymentsHandler" validate="false"/> </httphandlers>

我检查了我的 webconfig,果然&lt;handlers&gt;&lt;httpHandlers&gt; 中都有现有的处理程序

现在,我收到的是 403 错误,而不是旧的 500 错误。真的很困惑。

编辑 3:编辑

进步!我从 HTTPHandler 切换到 HTTPModule 并安装了我的 PaymentsHandler.vb 以匹配:

Public Class PaymentsHandler

    Implements IHttpModule

    Public Sub Init(context As HttpApplication) Implements System.Web.IHttpModule.Init

        AddHandler context.BeginRequest, New EventHandler(AddressOf context_BeginRequest)
        AddHandler context.EndRequest, New EventHandler(AddressOf context_EndRequest)
        AddHandler context.AuthorizeRequest, New EventHandler(AddressOf context_AuthorizeRequest)

    End Sub

    Private Sub context_AuthorizeRequest(sender As Object, e As EventArgs)
        'We change uri for invoking correct handler
        Dim context As HttpContext = DirectCast(sender, HttpApplication).Context

        If context.Request.RawUrl.Contains("account-payments.aspx") Then
            Dim url As String = context.Request.RawUrl.Replace("account-payments.aspx", "payments")
            context.RewritePath(url)
        End If
    End Sub

    Private Sub context_EndRequest(sender As Object, e As EventArgs)
        'We processed the request
    End Sub

    Private Sub context_BeginRequest(sender As Object, e As EventArgs)
        'We received a request, so we save the original URL here
        Dim context As HttpContext = DirectCast(sender, HttpApplication).Context

        If context.Request.RawUrl.Contains("account-payments.aspx") Then
            context.Items("originalUrl") = context.Request.RawUrl
        End If
    End Sub

    Public Sub Dispose() Implements System.Web.IHttpModule.Dispose

    End Sub

现在我可以看到正在重写!耶!因此,当我浏览到 website/account-payments.aspx 时,它会自动转到 website/payments/ 并且 然后 我收到 403 - Forbidden 错误。

所以它正在重写和重定向......但显然该页面现在被禁止了?

【问题讨论】:

  • 您应该浏览到website/payments,它会重定向到website/account-payments.aspx。您需要在代码中切换这些回合。 403是因为它认为你想查看payments目录,不允许列出内容。
  • 我在现有的两个带有 .aspx 扩展名的页面上进行了尝试,你是对的。但是,一旦我将其更改回无扩展的/payments 页面,我就会再次收到 403 错误。如果没有 .aspx 扩展名,它就无法工作吗?
  • 您是否也更改了path= 的web.config?尝试仅使用 path="*" 这应该通过您的处理程序发送任何请求。通常,您会尝试将请求限制为您希望必须处理的请求,即path="/payments
  • 您是否有理由从 Server.Transfer 切换到 RedirectPath?见stackoverflow.com/questions/1757336
  • 我读过this article,它建议不要使用httphandler,并说要改用httpmodule。它似乎没有指定路径?此外,这也是 RedirectPath 代码的来源。

标签: asp.net vb.net url-rewriting


【解决方案1】:

你可以试试这个

   void Application_BeginRequest(object sender, EventArgs e) {

    string fullOrigionalpath = Request.Url.ToString();

    if (fullOrigionalpath.Contains("/account-payments.aspx")) {
        Context.RewritePath("/payments.aspx");
    }
} 

我建议您阅读this blog 了解其他方法

【讨论】:

  • 感谢您的建议,我想我的 httpmodule 现在有点像这样了,而且一切都比以前好,但仍然无法正确加载页面?
  • 它需要很长时间还是无法加载。不正确是什么意思?
  • 它几乎立即更改浏览器中的 url,然后只加载一个通用的 403 禁止错误?
  • 对我来说这听起来像是一个管理权限问题。也许只有一些人可以重写。这是个人的事情还是公司的事情?
  • 这是公司的事情。我可以完全访问网站的所有源代码,但对公司服务器几乎没有权限。这可能是问题所在吗?
【解决方案2】:

您可以编写自己的 HttpHandler,您可以将其连接到 web.config。此类可以检查 HttpRequest url 并将其映射到您的 aspx 页面。

C#

public class PaymentsHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        if (context.Request.RawUrl.EndsWith("/payments/"))
        {
            context.Server.TransferRequest("account-payments.aspx");
        }
    }
}

VB

Public Class PaymentsHandler
    Implements IHttpHandler
    Public Sub ProcessRequest(context As HttpContext)
        If context.Request.RawUrl.EndsWith("/payments/") Then
            context.Server.TransferRequest("account-payments.aspx")
        End If
    End Sub
End Class

显然,映射请求的逻辑需要足够健壮。你像这样将它添加到web.config

<system.webServer>
    <handlers>
      <add name="Payments" verb="*" path="/payments" type="PaymentsHandler" resourceType="Unspecified" />
    </handlers>
</system.webServer>

看;

【讨论】:

  • 顺便说一句,您不必映射所有请求,只需处理您需要自定义逻辑的请求。另一个请求沿请求链向下传递,直到它们被完全处理。
  • 对不起,我不是很聪明。我是将该类创建为一个单独的类文件还是将它塞进我现有的一个 .aspx 文件中?
  • 我会为班级创建一个文件PaymentsHandler.cs 并将它放在App_Code 目录中。如果您的项目使用命名空间,我会将其添加到文件中,然后 web.config 需要包含 type="project.namespace.PaymentsHandler",您的项目命名空间位于类名之前。
  • 我现在得到了一个500 - Internal Server Error,我认为这是我之前得到的旧 404 的升级版。我在 VB.net 工作,如果这有什么不同?
  • 你能用 500 错误更新你的帖子吗?您可以启动一个调试会话,以便您可以单步执行代码吗?
猜你喜欢
  • 1970-01-01
  • 2013-12-31
  • 2016-01-13
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
相关资源
最近更新 更多