Проблема с переписывающим URL Htaccess: как отличить страницу со списком и подробностями - PullRequest
0 голосов
/ 15 марта 2011

Я разрабатываю коммерческий сайт, где пользователи могут публиковать элементы в любых категориях (категории могут быть от 2 до 4 уровней).

Я хочу создать URL для страниц со списком и подробной информацией:

  • На странице со списком будет отображаться список элементов во внутренней категории
  • Страница сведений будет отображать всю информацию для элемента во внутренней категории (Внутренняя категория означает последнюю категорию в иерархической структуре, т. Е. В /classified/autos4x4s/mitsubishi/lancer/ внутреннее среднее "lancer")

Вот ссылки, которые я хочу сгенерировать

  1. /classified/autos4x4s/mitsubishi/lancer/ (для листинга)

  2. /classified/autos4x4s/mitsubishi/lancer/2011/3/12/lancer-2002-in-good-condition-14/ (для деталей)

Я хочу перенаправить на ads.php, если в URL существует только 4 категории, и на detail.php, если передано 6 элементов (4 имени категории + 2 даты иtitle).

Я пишу эти правила:

#listing ads
RewriteRule ^(.*)/(.*)/(.*)/(.*)/?$ ads.php?c1=$1&c2=$2&c3=$3&c4=$4 [NC,L]

#Detail pages
RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/?$ detail.php?c1=$1&c2=$2&c3=$3&c4=$4&dt=$5&at=$6 [NC,L]

Но все страницы сайтов перенаправляются на ads.php (страницу со списком), даже домашнюю страницу.

Я изменяюправила следующим образом: (Хотя я не хочу использовать Listing и Detail в начале URL. Почему, как я вижу на некоторых сайтахкак я хочу: /classified/autos4x4s/mitsubishi/lancer/2011/3/12/lancer-2002-in-good-condition-14/)

#Listing pages
RewriteRule ^Listing/(.*)/(.*)/(.*)/(.*)/?$ ads.php?c1=$1&c2=$2&c3=$3&c4=$4 [NC,L]

#Detail pages
RewriteRule ^Detail/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/?$ detail.php?c1=$1&c2=$2&c3=$3&c4=$4&dt=$5&at=$6 [NC,L]

Теперь все остальные страницы в порядке, но когда я пропускаю /classified/autos4x4s/mitsubishi/lancer/2011/3/12/lancer-2002-in-good-condition-14/, он всегда идет на страницу со списком (ads.php), а не на страницу с подробностями.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 16 марта 2011

Пожалуйста, обратите внимание на регулярное выражение:

(.*)/(.*)/(.*)/(.*)/(.*)/(.*)

Точка также будет соответствовать '/', поэтому для определенных URL это приводит к комбинаторному взрыву возможных совпадений, что делает переписывание очень неэффективным. Пожалуйста, рассмотрите возможность написания этой части, например:

(\w+)/(\w+)/(\w+*)/(\w+*)/(\w+*)/(\w+*)
([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)

Ваш вопрос также связан с этим: URL, содержащий 6 '/' символов, будет соответствовать вашему 4-х кратному шаблону косой черты (потому что. Соответствует / также)

Не могли бы вы попробовать:

#Listing pages
#e.g. /classified/autos4x4s/mitsubishi/lancer/
RewriteRule ^(\w+)/(\w+)/(\w+)/(\w+)/$ ads.php?c1=$1&c2=$2&c3=$3&c4=$4 [NC,L]

#Detail pages
#e.g. /classified/autos4x4s/mitsubishi/lancer/2011/3/12/lancer-2002-in-good-condition-14/ 
RewriteRule ^(\w+)/(\w+)/(\w+)/(\w+)/(\d+/\d+/\d+)/([^/]+)/$ detail.php?c1=$1&c2=$2&c3=$3&c4=$4&dt=$5&at=$6 [NC,L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...