我真的很喜欢拥有"漂亮"的URL(例如/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}
Nick.. 7
这个问题主要是关于URL设计,只是偶然的重写.一旦你设计好你的URL 很酷,有很多方法可以使它们工作,包括在服务器级重写或使用基于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".在这一点上,我认为它的回报正在减少.
这个问题主要是关于URL设计,只是偶然的重写.一旦你设计好你的URL 很酷,有很多方法可以使它们工作,包括在服务器级重写或使用基于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".在这一点上,我认为它的回报正在减少.
你可以得到"漂亮"的网址,但不是通过最漂亮的手段.
您可以将您的网址设置为:
/Products/Search/Type/{producttype}/Name_{name}/Address_{address}
然后一个mod_rewrite规则类似于:
RewriteRule ^Products/Search/Type/([a-z]+)(.*)?$ product_lookup.php?type=$1¶ms=$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和IIS mod_rewrite等效的同一行完成.