необязательный второй каталог в перенаправлении htaccess - PullRequest
0 голосов
/ 02 июня 2011

Привет я хочу написать редирект мод, который обрабатывает следующее:

www.domain.co.uk/brands переписывает на www.domain.co.uk/index.php?p=brands

www.domain.co.uk/brands/5 переписывает на www.domain.co.uk/index.php?p=brands&go=5

Может ли это быть достигнуто в одной строке без условного оператора?

Я написал это, но вторая строка игнорируется:

RewriteRule ^(.*)\.html$ index.php\?p=$1 [L]
RewriteRule ^((.*)/*)(.*)\.html$ index.php?p=$1&go=$2 [L]

Любая помощь будет высоко ценится

Ответы [ 3 ]

0 голосов
/ 02 июня 2011

Что ж, мне кажется, что первое правило будет соответствовать обеим версиям и переписать www.domain.co.uk/brands/5 в www.domain.co.uk/index.php?p=brands/5 - и тогда флаг [L] остановит сопоставление. В любом случае, оно не будет соответствовать второму правилу после перезаписи.

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

0 голосов
/ 02 июня 2011

Просто поменяйте порядок.В качестве общей практики у вас должны быть самые конкретные правила в первую очередь и самые общие, как в прошлом.Попробуйте это в своем .htaccess:

RewriteRule ^([^/]*)/(.*)\.html$ /index.php?p=$1&go=$2 [L,NC,QSA]
RewriteRule ^(.*)\.html$ /index.php?p=$1 [L,NC,QSA]

Это приведет к перенаправлению URI '/brands/5.html' в /index.php?p=brands&go=5 и URI '/brands.html' в /index.php?p=brands

0 голосов
/ 02 июня 2011
RewriteRule  (.*)(/(.*))?$  index.php?p=$1&go=$3 [L]

должен это сделать.

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

...