【问题标题】:What's the safest way to determine if 2 URLs are the same?确定 2 个 URL 是否相同的最安全方法是什么?
【发布时间】:2011-03-08 16:21:21
【问题描述】:

如果我有 URL A 说http://www.example.com/ 和另一个说http://www.example.com。在不查询网页并进行比较的情况下,确定两者是否相同的最安全方法是什么?

示例:

  1. http://www.example.com/ VS http://www.example.com(上面提到过)
  2. http://www.example.com/aa/../ VS http://www.example.com

编辑: 澄清:只是想知道根据 RFC 1738 标准,在等效的上下文中 URL 是否相同。

【问题讨论】:

  • 在您的上下文中定义“相同”的含义
  • 您想知道网址或内容是否相同?从技术上讲不是,但对于大多数网站来说,两者都可以。
  • 只是想知道在根据 RFC 1738 标准等效的上下文中 URL 是否相同。

标签: c# url c#-3.0


【解决方案1】:

在 .Net 中,您可以使用 System.Uri 类。

让 u1 = new Uri("http://www.google.com/");;

val u1 : Uri = http://www.google.com/

让 u2 = new Uri("http://www.google.com");;

val u2 : Uri = http://www.google.com/

u1.Equals(u2);;

验证它:bool = true

要进行更细粒度的比较,可以使用Uri.Compare 方法。还有一些静态方法可以处理 Uri 字符串中各种形式的字符转义和编码,这在彻底处理主题时无疑会证明是有用的。

【讨论】:

  • 那是什么语言?我猜是 IronPython 吗?
  • @Thomas Levesque:它看起来更像是一个交互式 F# 会话
  • 对,F# 交互式...我很懒,不想创建 C# 项目只是为了确保答案正确。我认为它足够清晰,甚至可能有助于让眼睛更习惯于看到 F#。
【解决方案2】:

如果不请求 URL,您几乎无能为力。但是您可以定义几种启发式方法:

  1. 删除尾部斜杠
  2. .htm.html 视为相同
  3. 假设/base//base/index.html 相同
  4. 删除查询字符串参数(可能会,也可能不会,取决于您的需要)
  5. 考虑url.comwww.url.com 相同。

这完全取决于您所说的“相同”网址到底是什么意思。

【讨论】:

  • 主机名等也存在问题,例如 www.example.com 与 example.com,或大写与小写(在 Windows 中无关紧要,但在其他平台上则不同) ,默认文档,斜杠等。所以我的回答是,这实际上取决于“相同”的含义,如果您担心的是内容,那么您需要请求它们。如果您想查找重复的 IIS SEO 工具包可以提供帮助:iis.net/download/SEOToolkit
  • 这些启发式方法都不正确。它们可能经常被证明是正确的,但通常不同的路径组件意味着不同的网页。
  • @George - 同样,必须定义“相同”URL 的确切含义。当然,在不同的情况下,这些启发式方法可能没有用。
【解决方案3】:

Yuval A 的答案有几件事要补充:

  • www.google.com 和 http://www.google.com 可能指向同一个目标
  • www.google.com 和 google.com 指向同一个页面(但是是通过重定向实现的)
  • 可以对 URL 进行编码(请参阅 HttpUtility.UrlEncode / Decode 方法)

【讨论】:

    【解决方案4】:

    为了那些不了解 F# 的人的利益,这里有一个快速、肮脏但完整的 C# 控制台应用程序,它演示了如何使用 Uri 类来判断两个 URL 是否相同。运行此代码时,您应该会看到两行:“true”,然后是“false”:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(IsSameUrl("http://stackoverflow.com/", "http://stackoverflow.com").ToString());
                Console.WriteLine(IsSameUrl("http://stackoverflow.com/", "http://codinghorror.com").ToString());
                Console.ReadKey();
            }
    
            static bool IsSameUrl(string url1, string url2)
            {
                Uri u1 = new Uri(url1);
                Uri u2 = new Uri(url2);
                return u1.Equals(u2);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 2013-02-11
      • 2010-09-06
      • 2018-05-06
      • 2021-09-14
      • 2023-03-16
      相关资源
      最近更新 更多