搜索页面的漂亮网址

时间:2008-09-24 18:06:43

标签: routing

我真的很喜欢拥有“漂亮”的网址(例如/Products/Edit/1而不是/products.aspx?productID=1)但我对于如何为可以通过大量变量搜索的网页感到茫然

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

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

或者只是使用url params

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

7 个答案:

答案 0 :(得分:7)

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

美丽是旁观者的眼睛,但我同意你的观点,很多搜索网址都是丑陋的。是什么让他们如此?我认为使URL变得丑陋的主要原因是URL不会增加语义,但却是实现细节的结果,如(.aspx)或其他扩展。我的规则是,如果一个URL返回(X)HTML而不应该有一个扩展名,否则它应该。

在搜索的情况下,事实是标准搜索语法确实增加了含义:它表示页面是搜索,它表示参数已命名并可重新排序。丑陋主要来自于?& =字符,但实际上你做的其他事情就是将这些相同的字符替换为更有吸引力的字符,如| - /,但代价是使URL对任何希望解析的软件都不透明它就像蜘蛛,缓存代理服务器或其他东西。

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

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

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

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

答案 1 :(得分:5)

你可以获得“漂亮”的网址,但不是通过最漂亮的手段......

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

/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};

将参数设置为“漂亮”网址而非POST可让用户更轻松地为特定搜索添加书签。

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

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

它还假设一个LAMP堆栈(用于mod_rewrite和PHP的Apache),但可以使用asp.net和an IIS mod_rewrite equivalent沿着相同的行完成。

答案 2 :(得分:1)

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

关于网址的长度,ID仍然使用漂亮的网址,但是特别长的网址可能表示您可能需要重新考虑您的商品分组,如果您愿意,可以更改分类产品/ {NAME} / {地址}没有中间网址部分。

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

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

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

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

答案 3 :(得分:1)

我们有类似的网址重写,使用IIS 6,我们将重定向定义为:

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

这需要一个表格的网址

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

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

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

答案 4 :(得分:1)

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

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

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

等...

在一天结束时 - 搜索之王'Google'不介意将查询字符串留在网址中,所以它不会太糟糕:)

答案 5 :(得分:0)

您可以使用网址重写器或构建自己的网址重写器。您的网站开发了哪种语言?

答案 6 :(得分:0)

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

What is the best method to achieve dynamic URL Rewriting in ASP.Net?

在那里你可以找到关于这个主题的不同资源。