【问题标题】:URL Masking in .Net / HTML.Net / HTML 中的 URL 掩码
【发布时间】:2011-04-26 03:24:20
【问题描述】:

我有一个网站,其中有许多类别,每个类别中有许多子类别,每个类别中有许多产品。由于 URL 对用户非常不友好(它们包含 GUID !!!),我想使用一种我认为称为 URL Masking 的方法。例如,他们不会去 catalogue.aspx?ItemID=12343435323434243534,而是去 notpads.htm。这将显示与转到 catalogue.aspx?ItemID=12343435323434243534 将显示的内容相同。

我知道我可以通过为每个类别/子类别创建一个文件来做到这一点(单个产品不能单独访问,因为它是一个批发网站 - 客户不能直接从该网站购买)。这将是很多工作,因为每当类别/子类别/产品可见性发生变化,或描述发生变化,名称发生变化时,服务器都必须更新每个相关文件......你明白了......

我尝试过使用服务器端包含,但是当在 html 文件中指定 .aspx 文件时,它不喜欢它。

我也尝试过使用 iframe 设置为 100% 宽度/高度并绝对定位在左侧 0 和顶部 0。这非常有效,但我知道您不应该使用此方法的原因,例如某些搜索引擎无法应对很好。我还注意到“父”页面(notepads.htm)的标题不是 iframe 中设置的标题(逻辑上这是正确的 - 但如果我继续使用此方法,我需要解决另一个问题)。

谁能建议我可以做到这一点的另一种方法,或者告诉我使用 iframe 是否沿着正确的路线前进?谢谢。

问候,

理查德

PS 如果这是我正在尝试做的错误名称,那么请告诉我它实际上是什么,以便我可以重命名/重新标记它。

【问题讨论】:

  • 您应该查看 URL 重写 (addedbytes.com/for-beginners/url-rewriting-for-beginners)。确切的详细信息将根据您使用的 Web 服务器(IIS、Apache 等)而有所不同。 PS - 我更新了您的标签以包含该关键字。另外,这真的和htmlvb.net 无关。
  • 无论你做什么,都不要使用 IFrame!
  • 谢谢。我放了 HTML 和 VB.Net,因为网站是用 VB.Net 制作的,我想用 HTML 页面来显示 .aspx 页面的内容。
  • @Cheeso:我曾经在一个严格禁止使用 iFrame 的委员会工作;这就是我提出这个问题的原因。如果不是因为那份工作,我会以为我已经找到了解决方案,而不再寻找了..

标签: html vb.net url-rewriting


【解决方案1】:

查看 URL 重写。您可以创建一个正则表达式并将其映射到您的真实网址。例如

http://mysite.com?product=banana 

可以映射到

http://mysite.com?guid=lakjdsflkajkfj3lj3l4923892&asfd=9234983920894893

【讨论】:

  • 谢谢,但我不确定我是否可以访问服务器上的 IIS - 我相信,因为它是共享的,所以我们不能做这样简单(而且非常有用)的事情,也不能基于服务器直接来自 SQL Server 2005 Management Studio...我正在认真讨论升级到专用托管...
  • 再考虑一下,将成本乘以 10.... 可能不会 - 至少目前还不会。
  • 如果您的主机使用 IIS7,那么重写规则将存储在您应该有权访问的 web.config 中。您可以要求他们启用它。如果他们使用 IIS6,那么他们可以安装 IIRF 重写模块,您可以使用所有规则编辑 iirf.txt 文件。我认为大多数主机,即使是共享主机,都会提供此功能。它被许多 CMS 应用程序使用。
  • 谢谢。我应该早点想到这一点,但那一点跳过了我的想法。当我将模块用于另一个站点时,我确实注意到它都在 web.config 中。在考虑了一段时间后,我注意到的另一件事是名称和值在数据库中是链接的。我希望 notepads.htm 与 catalogue.aspx?ItemID=1234567890 相关。如果我没记错的话,这将需要一些服务器端代码来匹配两者(除非有另一种我没有想到的方法)。有没有办法用模块做到这一点?如果是这样,那就完美了。
  • 不完全确定你在问什么。如果您有 catalogue.aspx?ItemID=123456890 并且它完全映射到 notepads.htm,那么您将拥有一个一对一映射的规则。您将为每个页面创建一个单独的规则。如果你有更通用的东西,比如 catalogue.aspx?cat=4009320&size=849302 其中 cat 和 size 映射到说“shoes”和“32cm”,那么你可以有一个规则,用户键入 catalogue.aspx?cat=shoes&size42cm 并获取同一页。然后将针对其他类似页面重复此操作,例如其他鞋码。
【解决方案2】:

我相信你的意思是URL Rewriting

IIS 7+ 内置了一个 rewrite module,您可以将其用于此类事情。

【讨论】:

    【解决方案3】:

    URL 重写器解决了您所描述的问题 - 当有人请求页面 A 时,显示页面 B - 以一般方式。

    但你的不是一般要求。您似乎有一个有限的 uuid-to-shortname 映射要求。这是您可以或应该自己在您的应用程序中设置的东西,而不是在您的系统中插入一个新机器。

    在默认的 .aspx 页面中,您只需从存储在某处的持久表中的 url 查找短名称,然后调用 Server.Transfer() 到与该短名称关联的 uuid 命名的页面。

    制作这个原型应该很容易。

    【讨论】:

    • 谢谢芝士。我正在研究这个,但这需要在每次创建类别/子类别时创建一个新页面;因此,在这个新页面中使用服务器端代码意味着重新编译应用程序,对吗?还是我在这里弄错了?
    • 不,每个新 UUID 的新页面不是我想象的那样。试试这篇文章:msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2010-11-25
    • 2011-04-27
    • 2019-04-12
    • 2011-06-08
    • 1970-01-01
    • 2016-11-20
    相关资源
    最近更新 更多