#regex #apache #.htaccess #mod-rewrite #url-rewriting
#регулярное выражение #apache #.htaccess #мод-перезапись #url-переписывание
Вопрос:
Как я могу управлять 3 уровнями подкаталогов в Htaccess?
Объяснение:
http://example.com/category1/
http://example.com/category2/
http://example.com/category3/
RewriteRule to *category.php?category=$1*
http://example.com/category1/type1/
http://example.com/category2/type7/
http://example.com/category3/type8/
RewriteRule to *type.php?category=$1amp;type=$2*
http://example.com/category1/type1/company3/
http://example.com/category2/type7/company4/
http://example.com/category3/type8/company9/
RewriteRule to *company.php?category=$1amp;type=$2amp;company=$3*
файл .htaccess находится в начальной корневой папке (где index.php )
Является ли следующий лучшим способом?
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/.] )(?:/)?$ /category.php?category=$1 [L]
RewriteRule ^([^/.] )/([^/.] )(?:/)?$ /type.php?category=$1amp;type=$2 [L]
RewriteRule ^([^/.] )/([^/.] )/([^/.] )(?:/.*)?$ /company.php?category=$1amp;type=$2amp;company=$3 [L]
Комментарии:
1. Если целью является предварительное разделение пути на несколько параметров, то да; это единственный вариант.
Ответ №1:
Вы довольно близки. Просто обратите внимание, что RewriteCond
это применимо только к next immediate RewriteRule
, поэтому проверка !-f
будет использоваться только для первого правила. У вас может быть отдельное правило для отмены всех запросов, которые относятся к существующим файлам и каталогам.
RewriteEngine On
# skip all files and directories from rewrite rules below
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteRule ^([w-] )/?$ category.php?category=$1 [L,QSA]
RewriteRule ^([w-] )/([w-] )/?$ type.php?category=$1amp;type=$2 [L,QSA]
RewriteRule ^([w-] )/([w-] )/([w-] )/?$ company.php?category=$1amp;type=$2amp;company=$3 [L,QSA]