дизайн URL электронной коммерции mod_rewrite - PullRequest
1 голос
/ 20 августа 2009

У меня проблемы с тем, как мне структурировать страницы со списком товаров, страницы товаров, веб-страницы.

Это примерно переводится так:

  1. /bags/nicebag.html = /product.php?product=nicebag&category=bags
  2. /nicebag.html = /product.php?product=nice_bag
  3. /bags = productlisting.php?&category=bags

Проблема в том, что веб-страницы будут иметь ту же структуру URL, что и номер 2 в списке /contact.html = page.php?page=contact

Причина, по которой он отдельно не указан в .htaccess, заключается в том, что веб-страницы могут иметь разные имена. И даже одна и та же страница может быть на нескольких языках.

Причина нет. 1 и 2 не объединены, это то, что иногда я просто хочу сослаться только на продукт, поскольку он может быть в нескольких категориях.

Какую структуру вы предлагаете?

.htaccess

# Mod rewrite enabled.
Options +FollowSymLinks
RewriteEngine on

# ---- Rules ----

# product.php (Search for category & product name)
RewriteRule ^([A-Za-z0-9-_]+)/([A-Za-z0-9-_]+)\.html?$ product.php?prod_id=$2&cid=$1 [NC,L]

# productlisting.php (Search for category)
RewriteRule ^([A-Za-z0-9-_]+)?$ productlisting.php?&cid=$1 [NC,L]

Ответы [ 6 ]

4 голосов
/ 25 августа 2009

Я бы использовал префикс пути /products/, чтобы определить URL-адреса продуктов. Итак:

  • /products/bags/nicebag.html/product.php?product=nicebag&category=bags
  • /products/nicebag.html/product.php?product=nice_bag
  • /products/bags/productlisting.php?&category=bags

С такой структурой вы также можете переписать /products/ в /productlisting.php, чтобы затем показать все продукты.

# product listing
RewriteRule ^products/$ productlisting.php [L]
RewriteRule ^products/([A-Za-z0-9-_]+])$ productlisting.php?category=$1 [L]
# product details
RewriteRule ^products/([A-Za-z0-9-_]+)\.html$ product.php?prod_id=$1 [L]
RewriteRule ^products/([A-Za-z0-9-_]+)/([A-Za-z0-9-_]+)\.html$ product.php?prod_id=$2&cid=$1 [L]
# other pages
RewriteRule ^([A-Za-z0-9-_]+)\.html$ page.php?page=$1 [L]
2 голосов
/ 30 августа 2009

используйте разные суффиксы для разных типов, например, html для продуктов и htm для страниц или что-то в этом роде

/bags/nicebag.html = /product.php?product=nicebag&category=bags
/nicebag.html = /product.php?product=nice_bag
/bags = productlisting.php?&category=bags
/contact.htm = page.php?page=contact

или

/contact/page.html = page.php?page=contact
2 голосов
/ 29 августа 2009

Поскольку поддерживать ваши правила перезаписи в файле .htaccess будет грязно и громоздко, я бы добавил туда только одно правило, переписав что-то вроде:

/dispatch.php?request=[request]

, например

RewriteRule ^(.*)$ dispatch.php?request=$1 [L,QSA]

В dispatch.php вы разбиваете запрос на его элементы (path, querystring, anchor, ...) и решаете, куда идти дальше. Таким образом, вы можете использовать код для принятия решений, что даст вам гораздо большую гибкость, чем просто ведение огромного списка пользовательских сопоставлений перезаписи.

Например, вы можете идентифицировать элементы продукта и категории в пути, выполнив запросы к вашей базе данных и основывая логику отправки на результатах более общим способом.

[Pseudocode]
if (isProduct($lastPathElement)) {
  // Maybe verify that leading path elements are categories ...
  // Other preparations/verifications ...
  // refer execution to product.php
}
elseif (isCategory($lastPathElement)) {
  // Other preparations/verifications ...
  // refer execution to productlisting.php
}
// ... (Checks for other specific stuff)
else {
  // Static page or 404
  // refer execution to page.php
}
0 голосов
/ 25 августа 2009

Я бы порекомендовал плоскую структуру:

  • domain.com / bags
  • domain.com / контакт
  • domain.com / хороший мешок
0 голосов
/ 25 августа 2009

Нет почти никакого способа провести различие между www.examples.com/nicebag.html и www.examples.com/contact.html без помещения имен веб-страниц, не принадлежащих продукту, в .htaccess или какой-либо предварительной обработки в принимающем сценарии php. .

Как я вижу, варианты:

  1. переписать все запросы к page.php, а для тех, которые не соответствуют ни одной из страниц, не относящихся к продукту, включить скрипт продукта

  2. записывать имена страниц, не относящихся к продукту, в .htaccess динамически (беспорядочно и подвержено ошибкам) ​​

  3. переосмыслить структуру URL для страниц, не относящихся к продукту. Возможно, всего лишь www.example.com/page/contact.html может помочь

В любом случае, я бы пошел на третий.

0 голосов
/ 20 августа 2009

Я столкнулся с той же проблемой несколько недель назад. Закончено определение другой структуры для «статических» страниц.

www.examples.com / контакт / или же www.examples.com/info/contact.html

Так его можно отличить от «динамических» страниц.

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