OK сначала опции MultiViews : в соответствии с руководством Apache:
Content negotiated "MultiViews" are allowed using mod_negotiation.
Короче говоря, если у вас есть файл с именем foo.html
и если браузер запрашивает http://example.com/foo
, то Apache автоматически находит и добавляет расширение и передает foo.html
в браузер, а не выдает 404 . Это приводит к сбою многих правил перезаписи, поэтому я отключил его в начале своего ответа на ваш предыдущий вопрос.
Теперь, чтобы исключить обработку реальных каталогов с помощью правил перезаписи, нам понадобится дополнительное условие, подобное этому: RewriteCond %{REQUEST_FILENAME} !-d
Для поддержки нескольких симпатичных схем URL:
У вас есть несколько вариантов здесь. Пожалуйста, скажите мне, какой вы хотели бы иметь, и я предоставлю правила для этого.
Вариант 1: В вашем URL-адресе должны быть var name
и var value
, например:
www.example.com/page/var1/cat/var2/subcat/var3/subsubcat/var4
ИЛИ
www.example.com/othervar1/var1/othervar2/var2/othervar3/var3/othervar4/var4
Этот дает вам максимальную гибкость и очень прост в использовании в правилах переписывания, если вы хотите пойти по этому маршруту. Для этой опции правила перезаписи должны быть написаны только один раз, и вы будете в порядке для будущих изменений, пока число переменных не изменится
Вариант 2: Разница Старт для каждой схемы. Например:
www.example.com/handler1/var1/var2/var3/var4
ИЛИ
www.example.com/handler2/var1/var2/var3/var4
Это дает вам более короткий URL, но не обеспечивает гибкость, как предыдущий вариант. Но с этим также очень легко справиться в правилах переписывания. Однако для этой опции правила перезаписи должны быть написаны для каждой комбинации
Поэтому я бы порекомендовал вариант 1 и был бы рад подготовить для вас .htaccess, если вам тоже нравится этот вариант.
.htaccess файл для варианта 2
Options +FollowSymlinks -MultiViews
RewriteEngine on
# 404 handler
ErrorDocument 404 /notFound.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^handler1/([^/]+)/?$ /?page=$1 [NC,QSA,L]
RewriteRule ^handler1/([^/]+)/([^/]+)/?$ /?page=$1&cat=$2 [NC,QSA,L]
RewriteRule ^handler1/([^/]+)/([^/]*)/([^/]*)/?$ /?page=$1&cat=$2&subcat=$3 [NC,QSA,L]
RewriteRule ^handler1/([^/]+)/([^/]*)/([^/]*)/([^/]*)/?$ /?page=$1&cat=$2&subcat=$3subsubcat=$4 [NC,QSA,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^handler2/([^/]+)/?$ /?othervar1=$1 [NC,QSA,L]
RewriteRule ^handler2/([^/]+)/([^/]+)/?$ /?othervar1=$1&othervar2=$2 [NC,QSA,L]
RewriteRule ^handler2/([^/]+)/([^/]*)/([^/]*)/?$ /?othervar1=$1&othervar2=$2&othervar3=$3 [NC,QSA,L]
RewriteRule ^handler2/([^/]+)/([^/]*)/([^/]*)/([^/]*)/?$ /?othervar1=$1&othervar2=$2&othervar3=$3othervar4=$4 [NC,QSA,L]
.htaccess файл для варианта 1
Options +FollowSymlinks -MultiViews
RewriteEngine on
# 404 handler
ErrorDocument 404 /notFound.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)(/.*)?$ $3?$1=$2 [N,QSA,DPI]
RewriteRule ^(/[^/]+|[^/]+/|/?)$ /index.php [L,QSA,DPI]
При использовании этих правил URL-адрес http://localhost/n1/v1/n2/v2/n3/v3/n4/v4
будет ВНУТРЕННЕГО перенаправлен на http://localhost/?n4=v4&n3=v3&n2=v2&n1=v1
, обрабатывая каждую пару сегментов URL-адресов, разделенных /
, как пару name-value
для QUERY_STRING. НО имейте в виду, если URI не имеет четного числа сегментов, например: http://localhost/n1/v1/n2/
, то он будет перенаправлен на http://localhost/?n1=v1
, отбрасывая дополнительные n2.