9

我真的很喜欢拥有“漂亮”的 URL(例如/Products/Edit/1,而不是/products.aspx?productID=1),但是对于让您通过大量变量进行搜索的页面,我不知道如何做到这一点。

例如,假设您有一个页面,允许用户搜索具有特定名称和特定地址附近的特定类型的所有产品。你会用很长的“漂亮”网址来做这件事吗

/Products/Search/Type/{producttype}/Name/{name}/Address/{address}

或者只是诉诸使用 url 参数

/Products/Search?productType={producttype}&name={name}&address={address}
4

6 回答 6

7

这个问题主要是关于 URL 设计的,只是偶然地关于重写。一旦你将你的 URL 设计的很酷,有很多方法可以让它们工作,包括在服务器级别重写或使用基于 URL 调度的 web 框架(我认为现在大多数现代 web 框架都这样做)。

美丽在情人眼中,但我同意你的观点,很多搜索网址都很丑陋。是什么让他们如此?我认为使 URL 变得丑陋的主要因素是 URL 中的杂乱无章,它没有添加语义含义,而是实现细节的结果,例如 (.aspx) 或其他扩展。我的规则是,如果一个 URL 返回 (X)HTML,那么它不应该有扩展名,否则它应该有。

在搜索的情况下,事实是标准搜索语法确实增加了含义:它表明该页面是一个搜索,它表明参数已命名且可重新排序。丑陋主要来自?像蜘蛛、缓存代理服务器或其他东西。

因此,请仔细考虑不使用标准语法,并确保您有充分的理由这样做。我认为,如果您的参数具有自然顺序并且必须全部定义以使搜索有意义紧凑,您可以将其推送到 URL 中。例如,在博客 URL 中,您可能有:

/weblog/entries/2008
/weblog/entries/2008/11
/weblog/entries/2008/11/22

对于分别定义 2008 年、2008 年 11 月和 2008 年 11 月 22 日的条目的搜索。您的 URL 应该是唯一且明确的;有时人们会输入 /-/ 来查找缺少的搜索参数,我认为这非常紧凑。但是,我会避免将可能很长的参数(例如自由格式的文本查询)推送到 URL 中。/weblog/entries/ contains/here%20is%20some%20freeform%20text%20blah%20blah 并不比使用查询语法更具吸引力。

如果您打算使用标准查询语法,那么选择有意义的参数名称可能会在一定程度上提高吸引力。products/search?description="blah" 虽然更长,但可能比 products/search?q="blah" 更好。在这一点上,我认为收益递减。

于 2008-09-24T18:27:26.570 回答
6

您可以获得“漂亮”的网址,但不是通过最漂亮的方式..

您可以将您的网址设置为:

/Products/Search/Type/{producttype}/Name_{name}/Address_{address}

然后是mod_rewrite规则,例如:

RewriteRule ^Products/Search/Type/([a-z]+)(.*)?$ product_lookup.php?type=$1&params=$2 [NC,L]

这将在您的product_lookup文件中为您提供 2 个参数:

$type = {producttype}
$params = "/Name_{name}/Address_{address}"

然后,您可以在product_lookup.php文件中实现一些逻辑以循环$params,将其拆分为“/”,根据“_”之前的任何内容对其进行标记,然后在搜索中正常使用结果参数,例如

// Split request params first on /, then figure out key->val pairs
$query_parts = explode("/", $params);
foreach($params as $param)
{
    $param_parts = explode("_", $param);
    // Build up associative array of params
    $query[$param_parts[0]] = $param_parts[1];
}
// $query should now contain the search parameters in an assoc. array, e.g.
// $query['Name'] = {name};

将参数设置为“漂亮”的 url 而不是 POST 可以让用户更轻松地为特定搜索添加书签。

这方面的一个例子是 http://www.property.ie/property-for-sale/dublin/ashington/price_200000-550000/beds_1/ - 用户选择的参数由“_”(价格范围和床位)表示,可以在内部翻译成您需要的任何参数格式,同时保持一个很好的可读 url。

上面的代码是一个没有错误检查(输入中的恶意分隔符等)的简单示例,但应该让您知道从哪里开始。

它还假设了一个 LAMP 堆栈(用于 mod_rewrite 和 PHP 的 Apache),但可以使用 asp.net 和IIS mod_rewrite 等效的.

于 2008-09-24T18:20:48.783 回答
1

MVC(模型视图控制器)框架是专门为解决这个问题而设计的。它使用一种 url 重写的形式将操作重定向到页面,并仅提供您正在寻找的功能。它使处理漂亮的网址变得轻而易举。

关于 URL 的长度,id 仍然使用漂亮的 url,但特别长的 URL 可能表明您可能需要重新考虑您的项目分组,如果您愿意,请更改分类 Products/{NAME}/{Address}没有中间网址部分。

MVC 框架的示例可以在以下位置找到:

.Net - http://www.asp.net/mvc/

PHP - http://www.phpmvc.net/

Java - http://struts.apache.org/

于 2008-09-24T18:14:26.023 回答
1

我们有类似的 url 重写,并且使用 IIS 6,我们将重定向定义为:

/content.aspx?url=$S&$P

这需要表单的 url

/content/page/press_room 并使其格式为

/content.aspx/url=/page/pressroom&

我不确定 IIS 有完整的 synyax 选项,但我确定你想要的可以用类似的方式完成。

于 2008-09-24T18:16:49.667 回答
1

如前所述 - 使用 HTTP Post 是最好的,但是您将失去人们将链接发送给人们/将其添加书签的能力。将查询字符串留在 URL 中并不会太糟糕。我已经设置好了,所以 url 字符串是这样的:

http://example.com/search/?productType={producttype}&name={name}&address={address}

然后对搜索结果进行分页,在查询字符串之前添加页码(因此如果需要,可以自定义查询字符串。

  • 第 1 页: http ://example.com/search/ ?productType= {producttype}&name={name}
  • 第 2 页: http ://example.com/search/2/ ?productType= {producttype}&name={name}
  • 第 3 页: http ://example.com/search/3/ ?productType= {producttype}&name={name}

ETC...

归根结底 - 搜索之王“谷歌”不介意将查询字符串留在 URL 中,因此不会太糟糕 :)

于 2008-09-24T18:20:00.940 回答
0

您可以在此处找到有关.NET 中路由的答案:

在 ASP.Net 中实现动态 URL 重写的最佳方法是什么?

在那里,您可以找到有关该主题的不同资源。

于 2008-09-24T18:18:20.773 回答