Переписать условие для сравнения каталога верхнего уровня из Request_URI - PullRequest
1 голос
/ 24 мая 2011

У меня есть несколько клиентов на моем веб-сайте, для каждого из которых настроены похожие сайты.Папки для этих учетных записей клиентов настроены для организационных целей по адресу:

mydomain.com/client/sampleclient
mydomain.com/client/anotherclient

и т. Д.

Я хочу, чтобы они могли получить доступ к своему контенту просто / sampleclient или / anotherclient.Для этого я добавил это правило в свой корневой .htaccess (спасибо Паоло Стефан ):

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/client/%{REQUEST_URI} -d
RewriteRule ^(.*)$ /client/$1 [L,QSA]

Это хорошо работает при перенаправлении корневого каталога.IE, mydomain.com/sampleclient отлично перенаправляет на mydomain.com/client/sampleclient.Однако он не работает для запросов в клиентских каталогах.Что-то вроде:

mydomain.com/sampleclient/orders

Проверяет, является ли client / sampleclient / orders каталогом, а это не так (я использую отдельную перезапись URL-адресов в клиентских каталогах), поэтому правило не применяется,Есть ли способ применить регулярное выражение к REQUEST_URI или что-то такое, чтобы я ТОЛЬКО проверял, существует ли каталог верхнего уровня request_uri перед применением правила?

1 Ответ

2 голосов
/ 25 мая 2011

RewriteCond может иметь часть совпадения в качестве первого аргумента, поэтому вы можете использовать

RewriteCond %{DOCUMENT_ROOT}/client/$1 -d
RewriteRule ^(.+?)/(.*)$ /client/$1/$2 [L,QSA]

Apache проверит, начинается ли% {REQUEST_URI} (^) с имени каталога ненулевой длины, за которым следует косая черта, затем он будет использовать первое совпадение, чтобы проверить, существует ли каталог с таким именем %{DOCUMENT_ROOT}/client/. Если это так, правило перезаписи будет применяться независимо от слэша (даже ничего).

например. если пользователь запрашивает страницу

mydomain.com/sampleclient/orders

Apache проверит, существует ли %{DOCUMENT_ROOT}/client/sampleclient и является ли он каталогом, и если да, то загрузит

mydomain.com/client/sampleclient/orders

Как правило, он будет загружать mydomain.com / client / sampleclient / [все, что следует после первой косой черты] .

Если вам не нужно загружать mydomain.com/client/sampleclient/orders и вы хотите применить правила перезаписи внутри каталога sampleclient, используйте

RewriteRule ^(.+?)/(.*)$ /client/$1/ [QSA]

То есть удалите $2 из строки замены и флаг L в квадратных скобках.

См. Также эти документы Apache для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...