Переписать URL-адрес с .htaccess для нескольких параметров

Этот вопрос может быть дубликатом. Но я не нашел для меня никакого решения. Я хочу переписать URL, где у меня есть один и два параметра уровня. первый параметр p, а второй - sp

www.domain.com/home должен указывать на www.domain.com/index.php?p=home а также www.domain.com/projects/99 должен указывать на www.domain.com/index.php?p=projects&sp=99

Как мне сделать в .htaccess?

В настоящее время мой htaccess является следующим,

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?p=$1
RewriteRule ^([^/]*)/([^/]*)\$ index.php?p=$1&sp=$2 [L]

Проблема с этим htaccess заключается в том, что он правильно указывает URL-адрес одного уровня. т.е. www.domain.com/home. Но не двухуровневый URL. то есть. www.domain.com/projects/99

Ответ 1

Вы должны относиться к правилам отдельно. Все условия, предшествующие правилам, применяются только к одному правилу. Следующее правило не затрагивается этим правилом. Вы пытались "объединить" два правила. Второе правило никогда не могло сравниться, поскольку первый из них был уловкой, которая изменила синтаксис. Кроме того, вы должны убедиться, что первое правило не захватывает нежелательные запросы. Также подумайте, хотите ли вы использовать оператор * или + в регулярных выражениях. Я предлагаю вам использовать оператор +, чтобы у вас было ясное сообщение об ошибке при запросе пустых значений для "страницы" или "подстраницы".

Итак, это может приблизиться к тому, что вы ищете:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ index.php?p=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)$ index.php?p=$1&sp=$2 [L]