代码之家  ›  专栏  ›  技术社区  ›  TheCodeJunkie

你如何设计一个可入侵的网址

  •  2
  • TheCodeJunkie  · 技术社区  · 17 年前

    假设您有一组产品类别以一个良好的树层次结构组织,并且您希望提供可入侵的URL来浏览这些产品类别。你可以这样做

    /catalog/categorya/categoryb/categoryc
    

    然后,您可以很容易地确定应该为哪个类别列出产品(请注意,需要完整的URL,因为您可以拥有具有相同名称但在层次结构中不同位置的类别)

    现在,在其中添加产品信息的好方法是什么?为了给您举个例子,您想要显示这个类别的产品遗忘

    /catalog/games/consoles/playstation/adventure
    

    只在URL末尾添加产品是很诱人的

    /catalog/games/consoles/playstation/adventure/oblivion
    

    但当你这样做的时候,你就失去了知道它的类别或是被称为遗忘的产品的能力。我个人认为不必添加后缀,比如.html

    /catalog/games/consoles/playstation/adventure/oblivion.html
    

    将是最好的解决方案,并使用某种前缀,例如

    /catalog/games/consoles/playstation/adventure/product:oblivion
    

    你也可以添加一些触发器,比如

    /catalog/games/consoles/playstation/adventure/PRODUCT/oblivion
    

    也不是很好,你会(尽管这不太可能是个问题)限制自己拥有一个叫做 产品

    到目前为止,后缀解决方案看起来像是我能想到的最人性化的方法,但我不喜欢使用扩展

    你对此有何看法?

    9 回复  |  直到 17 年前
        1
  •  10
  •   Kent Fredric    17 年前

    深邃的小路让我心烦。他们分享是可怕的。

    
    /product/1234/oblivion --> direct page
    /product/oblivion --> /product/1234/oblivion if oblivion is a unique product, 
                      --> ~ Diambiguation page if oblivion is not a unqiue product. 
    
    /product/1234/notoblivion -> /product/1234/oblivion
    
    /categories/79/adventure -->  playstation adventure games
    /categories/75/games -->  console games page
    /categories/76/games -->  playstation games page 
    /categories/games --> Disambiguation Page. 
    

    否则,长URL,而 貌似 可入侵,需要你让所有的节点元素正确地入侵它。

    以PHP.NET为例

    php.net/str_replace -->  goes to 
      http://nz2.php.net/manual/en/function.str-replace.php
    

    而且这个模型非常容易被黑客攻击,人们总是盲目地使用它。

    注意:w3c认为.html后缀在功能上没有意义,而且是多余的,在URL中应该避免使用。

    http://www.w3.org/Provider/Style/URI

        2
  •  6
  •   Chris Lloyd    17 年前

    让我们取消你的网址,以便更干燥(非重复)。以下是您要开始的内容:

    /catalog/games/consoles/playstation/adventure/oblivion
    

    真的,这一类 adventure 是多余的,因为游戏可以属于多种类型。

    /catalog/games/consoles/playstation/oblivion
    

    接下来让我感到震惊的是,也不需要控制台。将PC机和控制台机作为一个部分加以区分可能不是一个好主意。它们都是各种类型的机器,这样做只是增加了另一个层次的复杂性。

    /catalog/games/playstation/oblivion
    

    现在你要对你的网站做出一些决定了。我建议移除 playstation 在您的页面上分类,因为游戏可以跨多个平台存在,而且 games 类别。您的URL应该如下所示:

    /catalog/oblivion
    

    那么,你是如何得到一个游戏站所有动作游戏的列表的呢?

    /catalog/tags/playstation+adventure
    

    或者也许

    /catalog/tags/adventure/playstation
    

    命令并不重要。你还必须确保 tags 是产品的保留名称。

    最后,我假设您不能删除根 /catalog 因为冲突。但是,如果您的站点很小,并且没有很多其他部分,那么将所有内容减少到根级别:

    /oblivion
    /tags/playstation/adventure
    

    哦,如果 oblivion 不是一个独特的产品,只是构建一个包含其ID的slug:

    /1234-oblivion
    
        3
  •  1
  •   Lou Franco    17 年前

    这些看起来都很好(除了结肠)。

    关键是当他们猜错的时候该怎么做——不要把他们发送到404——相反,把你不知道的单词带到你的搜索页面上,然后把它们发送到你的搜索结果中——如果你能拼写检查的话更好。

        4
  •  1
  •   Stefan    17 年前

    如果您将不同的部分视为目标,那么产品本身就是另一个目标。 所有目标都应该可以通过target.html或只有target访问。

    目录/games/consoles/playstation.html
    目录/游戏/控制台/PlayStation

    目录/games/consoles/playstation/adventure.html
    目录/游戏/控制台/游戏站/探险

    目录/games/consoles/playstation/adventure/oblivion.html
    目录/游戏/控制台/游戏站/冒险/遗忘

    等等,让它保持一致。

    我的5美分…

        5
  •  1
  •   ja.    17 年前

    一个问题是,用户的“以良好的树层次结构组织的一组产品类别”概念可能与您的概念相匹配。 下面是大卫温伯格(David Weinberger)的“一切都很复杂”(Everything is Miscellaneous)在谷歌技术上的一次谈话,其中有一些关于分类东西的有趣想法:

    http://www.youtube.com/watch?v=x3wOhXsjPYM

        6
  •  0
  •   TheCodeJunkie    17 年前

    @LouFranco是的,任何一种方法都需要一个可靠的回退机制,并将其发送到某种建议页面,或者seach引擎都是很好的候选者。

    @斯特凡把两个目标都当作目标的问题是如何区分它们(如我所描述的)。在最坏的情况下,您首先访问数据库,查看是否有满足路径的类别,如果没有,则检查是否有满足路径的产品。问题是,对于每个产品路径,您最终都会对数据库进行无用的调用,以确保它不是一个类别。

    @有些是的,分隔符可能是一种可能的解决方案,但是.html后缀更易于用户使用,并且通常是已知的。

        7
  •  0
  •   user34537    17 年前

    我喜欢/videogames/consolename/tyre/title“,并使用/的数量来区分类别或产品。唯一让我担心的是多流派(或难以区分)。我强烈建议不要延长标题。你也可以做视频游戏(.php)?c=x360;t=oblivion;只是猜测丢失的信息,但是我喜欢/方法,因为它看起来更整洁。为什么要添加流派?使用标题的第一个字母或只做电子游戏/控制台/标题可能更容易/

        8
  •  0
  •   hasen    17 年前

    我卑微的经历,虽然与销售游戏无关,但告诉我:

    • 编辑们经常不给这些“鼻涕虫”取最好的名字,他们没有明智地选择它们。
    • 许多项目(逻辑上)属于几个类别,那么为什么(技术上)将它们限制在一个类别中呢?

    通过ID更好地设计项目URL(即/item/435/)

    • ID是稳定的(由数据库生成,不可由编辑器编辑),因此URL在一段时间内保持不变的可能性要大得多。
    • 它们不像URL的类别/项目名称样式那样公开(或依赖)数据库中对象的组织。如果更改基础设计(对象结构)以允许一个项属于多个类别,该怎么办?类别/项目URL突然变得不再有意义;您将更改URL设计,旧的URL可能不再工作。

    标签比类别好。也就是说,允许一个项目属于几个类别比为每个项目分配一个类别更好。

        9
  •  0
  •   Dave Sherohman    17 年前

    把两者都当作 目标是如何区分它们 (就像我描述的那样)。最坏情况 场景是你第一次击中你的 数据库以查看是否存在类别 它满足了道路,如果它 那你不检查是否有 产品。问题是 对于每个产品路径 最后打了个没用的电话给 数据库以确保它不是 类别。

    那又怎么样?不需要对产品和类别进行严格的区分,尤其是在URI中,除了额外的数据库调用可能会引起性能问题之外。如果这对你来说真的很重要,请考虑以下两个建议:

    1. 大多数页面视图可能是关于产品的,而不是类别的。因此,首先检查一个产品将最小化您需要加倍数据库查找的频率。
    2. 在应用程序中添加代码以显示生成每个页面所需的时间,然后前往最近的网吧。( 不是你的内部局域网! )带着秒表。从您的网站上调出一些页面,并列出每个页面需要多长时间。减去生成页面所需的时间。还要比较生成一个数据库查找页与两个数据库查找页所用的时间。然后问问自己,当建立一个网络连接、生成内容和下载内容总共需要1-2秒时,是否花费额外的0.05秒或更少的时间进行额外的数据库查找真的很重要?

    在重要的地方进行优化,比如创建对人友好的URL(如Chris Lloyd的答案)。不要浪费你的时间试图把最后一个可能的分数削去百分之一。

    推荐文章