Красивые URL-адреса для поисковых страниц - PullRequest
9 голосов
/ 24 сентября 2008

Мне действительно нравится иметь "красивые" URL-адреса (например, /Products/Edit/1 вместо /products.aspx?productID=1), но я не знаю, как это сделать для страниц, которые позволяют искать по большому количеству переменных.

Например, предположим, у вас есть страница, которая позволяет пользователю искать все продукты определенного типа с определенным именем и рядом с конкретным адресом. Вы бы сделали это с очень длинными "красивыми" URL-адресами

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

или просто используйте URL-параметры

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

Ответы [ 7 ]

7 голосов
/ 24 сентября 2008

Этот вопрос касается, прежде всего, дизайна URL и только случайно касается переписывания. После того как вы разработали свои URL-адреса для круто , существует множество способов заставить их работать, включая переписывание на уровне сервера или использование веб-инфраструктуры, которая выполняет диспетчеризацию на основе URL (я думаю, что большинство современных веб-структур сделать это в эти дни).

Красота в глазах смотрящего, но я согласен с вами, что многие поисковые URL ужасны. Что делает их такими? Я думаю, что основная вещь, которая делает URL-адреса ужасными, - это бессмысленность URL-адреса, которая не добавляет семантического значения, но является результатом деталей реализации, таких как (.aspx) или других расширений. Мое правило состоит в том, что если URL возвращает (X) HTML, то он не должен иметь расширения, в противном случае он должен.

В случае поиска, тот факт, что стандартный синтаксис поиска добавляет значение: это указывает, что страница является поиском, это указывает, что аргументы названы и переупорядочены. Уродство в основном происходит от символов? & =, Но на самом деле все, что вы делаете, это заменяет эти же символы более привлекательными символами, такими как | - /, но за счет непрозрачности URL-адреса для любого программного обеспечения, которое хочет его проанализировать. как паук, кеширующий прокси-сервер или что-то еще.

Так что подумайте о том, чтобы не использовать стандартный синтаксис, и убедитесь, что у вас есть веская причина для этого. Я думаю, что в случае, когда ваши аргументы имеют естественный порядок и , все должны быть определены, чтобы поиск имел смысл, и компактны, вы можете вставить его в URL. Например, в URL-адресе блога у вас может быть:

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

Для поиска, определяющего записи за 2008, ноябрь 2008 и 22 ноября 2008 соответственно. Ваши URL должны быть уникальными и однозначными; иногда люди вставляют / - / для пропущенных параметров поиска, что я считаю довольно компактным. Однако я бы не вставлял в URL потенциально длинные параметры, такие как текстовый запрос произвольной формы. / weblog / записи / содержащий / здесь% 20is% 20some% 20freeform% 20text% 20blah% 20blah не так привлекателен, как использование синтаксиса запроса.

Если вы собираетесь использовать стандартный синтаксис запроса, то выбор значимых имен аргументов может несколько повысить привлекательность. products / search? description = "blah", хотя и дольше, вероятно, лучше, чем products / search? q = "blah". Я думаю, что в этот момент отдача уменьшается.

5 голосов
/ 24 сентября 2008

Вы можете получить "красивые" URL-адреса, но не с помощью самых красивых средств ..

Вы можете настроить свой URL-адрес следующим образом:

/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]

Это даст вам 2 параметра в вашем файле product_lookup:

$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, позволяет пользователям легче создавать закладки для определенных запросов.

Примером этого в действии является <a href="http://www.property.ie/property-for-sale/dublin/ashington/price_200000-550000/beds_1/" rel="nofollow noreferrer">http://www.property.ie/property-for-sale/dublin/ashington/price_200000-550000/beds_1/</a> - выбранные пользователем параметры обозначаются символом «_» (диапазон цен и кровати), который можно внутренне перевести в любой формат параметров, в котором вы нуждаетесь, сохраняя при этом приятный для чтения URL.

Приведенный выше код является тривиальным примером без проверки ошибок (разбойники и т. Д. Во входных данных), но он должен дать вам представление о том, с чего начать.

Он также предполагает использование стека LAMP (Apache для mod_rewrite и PHP), но его можно выполнить в том же ключе, используя asp.net и эквивалент IIS mod_rewrite .

1 голос
/ 24 сентября 2008

Как уже упоминалось ранее - лучше использовать HTTP Post, но тогда вы потеряете возможность для людей отправлять ссылку людям / добавлять ее в закладки. Оставлять строку запроса в URL не так уж плохо. Я настроил его так, чтобы строка URL была такой:

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

А затем для разбивки на страницы результатов поиска добавьте номер страницы перед строкой запроса (чтобы при необходимости строку запроса можно было настраивать.

и т.д ...

В конце дня - король поиска "Google" не прочь оставить строку запроса в URL, чтобы она не была слишком плохой:)

1 голос
/ 24 сентября 2008

У нас аналогичная перезапись URL, и с помощью IIS 6 у нас есть перенаправление, определенное как:

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

Это займет URL вида

/ content / page / press_room и делает его в формате

/ content.aspx / URL = / страница / штамповка &

Я не уверен в полных опциях synyax, которые есть в IIS, но я уверен, что то, что вы хотите, может быть сделано аналогичным образом.

1 голос
/ 24 сентября 2008

Среда MVC (Model View Controller) разработана специально для решения этой проблемы. Он использует форму переписывания URL для перенаправления действий на страницы и предоставляет только те функции, которые вы ищете. Это делает обработку симпатичных URL бризом.

Что касается длины URL-адресов, в идентификаторе по-прежнему используются симпатичные URL-адреса, но особенно длинный URL-адрес может указывать на то, что вы, возможно, захотите пересмотреть свою группу элементов, если хотите, измените классификацию. {Адрес} без промежуточных частей URL.

Примеры инфраструктуры MVC можно найти по адресу:

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

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

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

0 голосов
/ 24 сентября 2008

Вы можете найти ответ о Маршрутизация в .NET здесь:

Каков наилучший способ достижения динамического перезаписи URL в ASP.Net?

Там вы можете найти различные ресурсы по теме.

0 голосов
/ 24 сентября 2008

Вы можете использовать переписчик URL или создать свой собственный. На каком языке разработан ваш сайт?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...