Можно ли указывать необязательные параметры RewriteRule при написании ЧПУ. Допустим есть скрипт с запросом - cats.php?type=test&id=1&sort=datea&page=1 и для него пишем:
RewriteRule ^cats/(.*)/(.*)/(.*)/(.*)$ cats.php?type=$1&id=$2&sort=$3&page=$4 [L]
А что если допустим, переменная page не обязательна и можно обратиться к скрипту без нее - cats.php?type=test&id=1&sort=datea. Как правильно написать такое правило?
Может быть так?
RewriteRule ^cats/(.*)/(.*)/(.*)/(.*)$ cats.php?type=$1&id=$2&sort=$3&page=$4 [L]
RewriteRule ^cats/(.*)/(.*)/(.*)$ cats.php?type=$1&id=$2&sort=$3 [L]
Забавно, но вот так вот работает:
RewriteRule ^cats/(.*)/(.*)/(.*)/(.*)$ cats.php?type=$1&id=$2&sort=$3&page=$4 [L]
RewriteRule ^cats/(.*)/(.*)/(.*)$ cats.php?type=$1&id=$2&sort=$3 [L]
А вот так вот, нет:
RewriteRule ^cats/(.*)/(.*)/(.*)$ cats.php?type=$1&id=$2&sort=$3 [L]
RewriteRule ^cats/(.*)/(.*)/(.*)/(.*)$ cats.php?type=$1&id=$2&sort=$3&page=$4 [L]
mod_rewrite останавливается на первом правиле, которое подходит.
Строка cats/1/2/3/4 соответствует и ^cats/(.*)/(.*)/(.*)/(.*)$, и ^cats/(.*)/(.*)/(.*)$. Если хотите получить свободу перестановки, то побеспокойтесь о том, чтобы соответствующие строки не пересекались. Например, можно заменить (.*) на ([^/]*). Ну и * я бы заменил на +, потому что пустых "директорий" уж точно следует избегать.
Для опциональных параметров можете воспользоваться квантификатором ?, например, ^cats(/([^/]+)(/([^/]+)(/([^/]+)(/([^/]+))?)?)?)?$. Но это ужас, конечно, и так делать не стоит.
P. S. Такие урлы ни в каком приближении не являются "человекопонятными". Такими правилами вы только запутаете поисковики, которые заблудятся в ваших бесконечных "директориях". Не надо бездумно превращать каждый GET-аргумент в директорию.
P. P. S. Воспользуйтесь роутером на PHP, а не генерируйте кашу в .htaccess. См. "Как сделать всё и сразу в mod_rewrite?"
Продвижение своими сайтами как стратегия роста и независимости