定义Web应用程序URL的最佳方法

时间:2009-08-10 13:46:29

标签: language-agnostic web-applications

我一直发现,在Web应用程序中定义其他“页面”的URL看起来既脆弱又脆弱或臃肿。

E.g。您有一个管理客户,销售,潜在客户的应用程序,因此有以下“页面”。

  • customerlist
  • viewcustomer
  • editcustomer
  • addcustomer
  • viewcontact
  • editcontact
  • 的addContact
  • 前景(x3?x4?)
  • 销售(x?)
  • 产品(x?)
  • request(x?)
  • 预测(x?)
  • 等。 ...

随着应用程序的增长,页面数量会立即增长到包含100多个URL的列表。

逻辑说,只需在页面上需要的地方复制/粘贴这些URL很难看并且很难维护,但如果在“this”页面上只需要2或3个,那么加载100多个键/值似乎是多余的

从技术上讲,这是一个与语言无关(ASP,JSP,PHP,RoR,Python等)的问题,但我打算用PHP实现(在MVC设置中)。但是,如果ASP.Net或Rails有一种“非常酷”的方式,那么我就是耳朵。

更新

我正在将非MVC PHP应用程序转换为使用MVC结构。以前我有一大组密钥链接,它们是页面的基本URL,例如:

$URLs['CUSTOMER_ORDER_CONTACTS'] = '/customerordercontacts.php';
$URLs['CUSTOMER_PRODUCTS_EDIT'] = '/editcustomerproducts.php';
//etc.

由于我可能从任何地方链接到“客户产品编辑”屏幕,因此每个页面都会加载此列表,以便在/当URL更改为另一个页面时...更改列表中的项目将更新所有链接。

然而,当我在这里阅读答案时,我想我可能会偶然回答我自己的问题。 @Blixt所写的内容几乎就是我/计划遵循的结构......此时,网址实际上是 结构化 ,其中我不喜欢根本不需要这个列表

示例:如果我正在呈现客户......并希望提供指向每个联系人的链接

//pseudo code
$contacts = $customer.getContacts();

//previous rendering list of links
foreach($contacts as $key => $value){
  echo('<a href="'.$URLs['CUSTOMER_CONTACT_VIEW'].'?customer='.$custID.'&contact='.$key.'">'.$value.'</a>');
}

//new rendering list of links
foreach($contacts as $key => $value){
  echo('<a href="/customer/'.$custID.'/contact/'.$key.'">'.$value.'</a>');
}

4 个答案:

答案 0 :(得分:1)

我希望尽可能保持URL的逻辑性,并避免使用特定于框架的URL(考虑到将来可能会更改框架,然后必须继续使用旧的URL模式以避免破坏外部链接。)

基本上:

# All customers:
/customers/
# New customer:
/customers/new
/customers/?new # another version if you don't think "new" deserves its own path
# Existing customer:
/customers/123/
/customers/123 # another version if you want the concept that it's a page, not a
               # directory
# Edit customer:
/customers/123/edit
/customers/123?edit

# Some sub-list for a customer:
/customers/123/orders/

# and so on...

老实说,在我提供两个例子的情况下,我个人更喜欢第二个例子。它使用文件系统中的概念,列出的是“目录”,单独的条目是“文件”。每条路径代表某种数据,其他路径使用查询字符串(/customers/?new)分隔。

在确定了URL结构后,您应该了解如何在Web框架中实现此功能。我认为“好”的大多数框架都对映射URL有某种支持(通常使用支持通配符的某种模式,例如正则表达式。)所以你的模式可能看起来像这样,使用我的第二个例子(正则表达式):

^/customers/$ -> CustomerList
^/customers/(\d+)$ -> Customer # This will check the query string for "edit" etc
                               # to determine which mode to use.
^/customers/(\d+)/orders/$ -> OrderList

答案 1 :(得分:0)

在CodeIgniter(PHP)中,它们将URL映射到对象及其方法,即

/customers/list/3

会致电Customers->list('3')。您足够灵活,可以根据单个URL的需要覆盖此行为。在我看来,这是一个非常好的方式。

Django(Python)允许你强制手动执行此操作。虽然这种尝试为您提供了最大的灵活性,通过正则表达式将URL映射到函数,但对于大型应用程序来说,它变得非常复杂。

也许这些方法有帮助。

干杯,

答案 2 :(得分:0)

PHP中的

我会选择这样一个简单的设置:

www.example.com/application/controller/action/parameter

,其中 application必须是目录

controller必须是其父级application

下的子网站

action必须是控制器中的方法(默认)OR可以是application->controller->action下的另一个子目录,因为有时我需要将方法和实际文件分开。

然后,参数可以传递给有效的应用程序有效控制器有效动作

对我而言,这是我能实现的最动态的设置。

如果你喜欢现实世界的例子,请问我。

答案 3 :(得分:0)

网址结构应考虑搜索引擎优化。即使该站点仅在组织内部运行,它也可能被内部引擎抓取,或者将来某个时候。以下是我认为有用的2种Google资源的几个关键点:

网址结构的良好做法

来自http://www.google.com/webmasters/docs/search-engine-optimization-starter-guide.pdf

  

使用网址中的字词 - 包含与您网站相关的字词的网址   内容和结构更友好   对于浏览您网站的访问者。   参观者更好地记住它们   可能更愿意链接到他们。

     

提供一个网址版本以访问文档 - 阻止用户   从链接到一个版本的URL   和其他人联系到不同的人   版本(这可能会拆分   这个内容之间的声誉   URL),专注于使用和引用   结构和内部的一个URL   链接你的网页。

网址结构

来自http://www.google.com/support/webmasters/bin/answer.py?answer=76329

  

网站的网址结构应尽可能简单。考虑一下   组织您的内容以便URL   在逻辑上和在一个   最容易理解的方式   人类(如果可能,可读的单词   而不是长ID号)。

     

请考虑在您的网址中使用标点符号。网址   http://www.example.com/green-dress.html   对我们来说比对我们更有用   http://www.example.com/greendress.html。   我们建议您使用连字符( - )   而不是你的下划线(_)   网址。

     

过于复杂的网址,尤其是那些包含多个参数的网址   可能会导致抓取工具出现问题   创造不必要的高数量   指向相同或的URL   您网站上的类似内容。作为一个   结果,Googlebot可能消耗很多   带宽超过必要的带宽,或者可能   无法完全索引所有   您网站上的内容。