在 ASP.NET 中重写 URL?

Posted

技术标签:

【中文标题】在 ASP.NET 中重写 URL?【英文标题】:Rewriting URLs in ASP.NET? 【发布时间】:2010-10-05 23:58:09 【问题描述】:

我正在使用 ASP.NET C#。

如何实现类似于 ***.com 的 URL 重写程序?

http://***.com/questions/358630/how-to-search-date-in-sql

另外,URL中的“358630”等值是什么意思?这是问题 ID(他们用来从表中获取数据的基础)吗?不管是什么,在我的应用程序中,我使用“ID”字段来识别记录。此字段是 SQL 表中的标识列。现在,我的网址如下:

http://myweb.com/showdetails.aspx?id=9872

但我希望它们看起来像:

http://myweb.com/showdetails/9872/my_question_title

或者:

http://myweb.com/9872/my_question_title

或者任何最好的方法,这对搜索机器人来说会很好吃。

我的应用程序托管在Go Daddy 的共享托管服务上,我觉得他们的服务器上没有自定义的 ASP.NET“HTTP 模块”或用于 URL 重写的自定义 DLL。我尝试了很多样品,但还没有成功!

我发现 Stack Overflow 托管在 Go Daddy(共享托管?)上。也许 Stack Overflow 的方法对我有用。

【问题讨论】:

不知道为什么这被否决了。对我来说似乎是一个合理的问题。 是的,这是一个完全合理的问题。 被反对者驱动。嘘。他们没有勇气说出为什么。 我猜有些 1337 人对 RTFM 的态度很生气,因为 Prashant 没有听说过 ASP.NET MVC。 :-) “搜索机器人的味道很好。”喜欢它。 【参考方案1】:

SO 正在使用ASP.NET MVC。您确实需要详细阅读 MVC URL 重写的工作原理,但要点是 URL 中的“问题”部分是控制器类的名称(大致对应于 URL 中的“显示详细信息”)和number 是该控制器上默认操作的 ID 参数(与 URL 中的参数“id”相同)。

【讨论】:

我正在使用 ASP.NET 2.0 (C#) 我可以使用 ASP.NET MVC 来开发我的应用程序吗?或者我需要 ASP.NET 3.x+ 才能使用 ASP.NET MVC? 得到了答案,它只适用于 ASP.NET 3.x+ 版本:( microsoft.com/downloads/… 实际上,您应该咨询您的托管服务。大多数提供 .Net 2.0 SP1 的公司通常也提供 .Net 3.5,看看 CLR 是如何相同的,而后者只是在框架中添加了更多类。【参考方案2】:

由于 MVC 不是一个选项,您可以尝试重定向 404。这将适用于 ASP.NET 1.1 及更高版本:使用 IIS 配置或 web.config 将 404 和 405 重定向到您自己的处理程序,解析处理程序中的请求并重定向到适当的资源。

<configuration>
   <system.web>
    <customErrors mode="On" defaultRedirect="error.html">
        <error statusCode="404" redirect="newHandler.aspx"/>
    </customErrors>       
   </system.web>
</configuration>

【讨论】:

伙计,这是一种骇人听闻的做法......这样做没有副作用吗? 用于在经典 ASP 中为较小的站点执行此操作,例如。 阅读要求。对搜索引擎有好处,受 ASP.NET 2.0 支持,可在共享主机上工作。您是否有适合要求的“不那么老套”的解决方案? 我不确定这对搜索引擎有没有好处 - IIS 不会发回状态 404 吗?【参考方案3】:

在 System.Web.Routing 出现之前,常见的做法是使用UrlRewriter.NET。工作得很好,但在配置 IIS 时可能会咬你。我不确定是否有任何简单的方法可以在 ASP.NET 中使用新的 Routing 类(即,将其放入并使用重构代码)。

【讨论】:

我不能使用这个,因为 UrlRewriter.NET 需要在 IIS 中安装,而且我在共享主机上,所以我没有权利这样做:(( 太糟糕了...一些共享主机提供商提供它作为选项;你可能想和他们核实一下。【参考方案4】:

请解释值的含义 比如网址中的“358630”

那是(大概)数据库中问题的 ID。在 MVC 模型中

 myurl.com/questions/358630

类似于

myurl.com/questions.aspx?id=358630

应用程序实际上忽略了 URL 末尾的问题标题。它通常被“附加”用于搜索引擎优化和人类可读性目的。事实上,您可以在 URL 中更改此问题的标题,并注意页面仍然可以正常加载。

【讨论】:

是的,但是对于“ID”,我的理解是,如果我在这个***.com/questions/521310/… url 中增加 +1,那么它应该打开下一个问题,而无需更改 url 的其他部分... 但是它把我转发到这个***.com/questions/521298/when-to-use-struct-in-c/… URL,*** 是如何维护这个的??? 我只能推测,但在某些情况下,他们可能会重定向到更规范的答案。例如,当您输入 ID 521311 时,它会重定向到 521298。因此您可以假设 521298 是 C# 中结构的最佳答案。 也许问题和答案(可能还有 cmets)都存储在同一个表中,并带有一些鉴别器列来定义类型/父级等 - 我看到用 a 引用的答案对 id 的 +1 与您提出问题的时间差不多。 在 CMS 中将所有内容存储在一个表中是相当普遍的,所以我不明白为什么 SO 不这样做。【参考方案5】:

新的 System.Web.Routing dll 是 ASP.NET 3.5 SP1 的一部分,并且是 bin deployable on ASP.NET 3.5,因此您可以使用 a classic ASP.NET WebForms site 上的功能。

您可能需要注意 Phil Haack 在他的 post on using MVC on IIS 6 中的 cmets,因为您可能需要在路由 url 中包含 .aspx 扩展名

http://www.mysite.com/controler.aspx/action/id

您可能还想查看Questions Tagged SEO。

url 末尾被忽略的问题名称通常称为“Slug”,用于 SEO 目的以在 url 中包含页面标题。

【讨论】:

以上是关于在 ASP.NET 中重写 URL?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 回发在 URL 重写中产生问题?

如何正确 URL 重写图像? C# ASP.NET

如何使用 url 重写将位置数据存储在我的 asp.net 站点上所有页面的 url 中?

asp.net、url 重写模块和 web.config

ASP.NET URL伪静态重写实现方法

ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL