.htaccess mod_rewrite с 3 уровнями каталогов

#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]